您的位置:首页 > 编程语言 > Python开发

python - 对字符列表进行组合输出

2017-09-04 17:05 465 查看
问题:
对字符列表进行组合输出
输入:a,b,c,d
输出:'a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd'

解决方案:
采用递归:
1、'a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd'
2、'b', 'bc', 'bcd', 'bd'
3、'c', 'cd'
4、'd'

讨论:
1、资源上存在浪费。在计算字符组合时,会重复计算相同的组合。将去重复放在字符组合处理过程中。
2、字符串长度为25时,处理时间约2秒。长度为62时,处理时间2323.19秒:
15 ['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd']
['t', '8', 'R', '4', 'o', 'm', 'p', 'S', 'D', 'V',
'x', 'v', 'z', 's', 'P', 'H', 'N', 'u', 'C', '2',
 'f', 'k', '9', 'U', 'L', 'i', 'l', 'A', 'O', 'W',
 'c', '0', 'F', 'a', 'b', 'd', 'G', 'Q', 'r', '1',
'J', 'Y', 'h', '7', 'y', '3', 'B', 'E', 'K', 'T',
'q', '5', 'M', 'g', 'j', 'X', 'I', 'Z', 'w', '6',
'n', 'e']
处理组合耗时 2323.19 秒
597618

源代码:
# -*- coding:utf-8 -*-
'''
对字符列表进行组合输出
输入:a,b,c,d
输出:'a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd'
采用递归:
1、'a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd'
2、'b', 'bc', 'bcd', 'bd'
3、'c', 'cd'
4、'd'
'''
import string
import random
import time
from datetime import datetime, timedelta

def str2list(str0):
'''字符串转列表,list0=list(str0)'''
pass
def list2str(list1):
'''列表转为字符串,str0=''.join(list1)'''
str0 = ''
for i in list1:
str0 += str(i)
return str0

def norepeat(list1):
'''去掉重复'''
list0 = []
list0.append(list1[0])
for i in list1:
if i not in list0:
list0.append(i)
return list0

# result = [] #取消全局变量
def list_handle(list1, result):
'''获取所有组合'''
length = len(list1)
# print 'list长度为%d\n' % length
if 1 == length:
result.append(str(list1[0]))
else:
# 第三次迭代,考虑abd场景
cnt = 1
while(1):
str0 = list2str(list1[0:cnt])
if str0 not in result:
result.append(str0)
for m in range(cnt, length, 1):
str1 = ''
while (length > m):
str1 += str(list1[m])
str_tmp = str0 + str1
if str_tmp not in result:
result.append(str_tmp)
m += 1
# print 'cnt---', cnt
# print result
cnt += 1
if length == cnt:
break
list_handle(list1[1:length], result)

# 第二次迭代,考虑a,ab,abc,abcd的场景
# str0 = str(list1[0])
# result.append(str0)
# for m in range(1,length,1):
#     str1 = ''
#     while(length > m):
#         str1 += str(list1[m])
#         result.append(str0 + str1)
#         m += 1
#
# str0 = str(list1[0]) + str(list1[1])
# m = 3
# str1 = ''
# while(length > m):
#     str1 += str(list1[m])
#     result.append(str0 + str1)
#     m += 1
# m = 3
# str1 = ''
# while(length > m):
#     str1 += str(list1[m])
#     result.append(str0 + str1)
#     m += 1

# 第一次迭代,直观的写出输出的方式
# str1 = str(list1[1])
# result.append(str0 + str(list1[length-3]))
# str2 = str(list1[2])
# result.append(str0 + str(list1[length-2]))
# result.append(str0 + str(list1[length-3]) + str(list1[length-2]))
# str3 = str(list1[3])
# result.append(str0 + str(list1[length-1]))
# result.append(str0 + str(list1[length-3]) + str(list1[length-1]))
# result.append(str0 + str(list1[length-2]) + str(list1[length-1]))
# result.append(str0 + str(list1[length-3]) + str(list1[length-2]) + str(list1[length-1]))

if __name__ == '__main__':
list_in = ['a','b','c','d']
result = []
list_handle(list_in, result)
print len(result),result
# print len(norepeat(result)), norepeat(result)

str0 = ''.join(random.sample(string.ascii_letters + string.digits, 25))
print list(str0)
result = []
begin_time = datetime.now()
list_handle(list(str0), result)
end_time = datetime.now()
delta_time = end_time - begin_time
print '处理组合耗时 %.2f 秒' % delta_time.total_seconds()
print len(result)

# begin_time = datetime.now()
# list_norepeat = norepeat(result)
# end_time = datetime.now()
# delta_time = end_time - begin_time
# print '去掉重复耗时 %.2f 秒' % delta_time.total_seconds()
# print len(list_norepeat)

'''
输出结果:
---
list长度为4

cnt--- 1
['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad']
cnt--- 2
['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd']
cnt--- 3
['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd']
list长度为3

cnt--- 1
['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd', 'b', 'bc', 'bcd', 'bd']
cnt--- 2
['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd', 'b', 'bc', 'bcd', 'bd', 'bc', 'bcd']
list长度为2

cnt--- 1
['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd', 'b', 'bc', 'bcd', 'bd', 'bc', 'bcd', 'c', 'cd']
list长度为1

22 ['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd', 'b', 'bc', 'bcd', 'bd', 'bc', 'bcd', 'c', 'cd', 'd']
15 ['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd']
'''
'''
改进后:将去掉重复的处理放在字符组合过程中。
15 ['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd']
['U', 'T', 'd', 'i', '7', 'm', 'J', 'V', 'B', 'O', 'w', 'y', 'c', 'H', '2', 'h', 'o', 'S', '4', 't', 'K', 'Z', 'A', 'g', 'f']
处理组合耗时 1.61 秒
15275
'''

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python