这个想法是创建一个包含一定数量字符的字符串列表,保留原始列表中的顺序。挑战是仅使用列表推导来实现它。
list_string = [ "aaa", "bb", "cc", "dd", "ee"]
str_len = 6
[some_list_comprehension]
结果应该是["aaabb", "ccddee"]
。结果列表中的字符串aaabb
长度为5个字符,而字符串ccddee
为6,这是因为原始列表中的字符串不能分块。创建结果时字符串的顺序是相关的,但结果不相关,因此结束列表可以是["ccddee", "aaabb"]
但不是["eeddcc", "bbaaa"]
。每个字符串在结果列表中出现的次数与原始字符串的次数相同,这意味着字符串的所有可能组合实际上并不是此问题的目标,主要是因为结果列表中的每个字符串都是按照原版的。
只有两种可能的输出:
["aaabb", "ccddee"]
或
["ccddee", "aaabb"]
答案 0 :(得分:2)
好的,我想我现在明白了。这是你在找什么?
>>> list_string = [ "aaa", "bb", "cc", "dd", "ee"]
>>> str_len = 6
>>> [[''.join(list_string[:i]), ''.join(list_string[i:])] for i in xrange(len(list_string)) if all(1 <= len(s) <= str_len for s in [''.join(list_string[:i]), ''.join(list_string[i:])])]
[['aaabb', 'ccddee']]
它产生可能与字符串的一个分区一起使用的所有可能组合。以下是所有可能的结果:
>>> for str_len in range(len(''.join(list_string))):
print str_len, [[''.join(list_string[:i]), ''.join(list_string[i:])] for i in xrange(len(list_string)) if all(1 <= len(s) <= str_len for s in [''.join(list_string[:i]), ''.join(list_string[i:])])]
0 []
1 []
2 []
3 []
4 []
5 []
6 [['aaabb', 'ccddee']]
7 [['aaabb', 'ccddee'], ['aaabbcc', 'ddee']]
8 [['aaa', 'bbccddee'], ['aaabb', 'ccddee'], ['aaabbcc', 'ddee']]
9 [['aaa', 'bbccddee'], ['aaabb', 'ccddee'], ['aaabbcc', 'ddee'], ['aaabbccdd', 'ee']]
10 [['aaa', 'bbccddee'], ['aaabb', 'ccddee'], ['aaabbcc', 'ddee'], ['aaabbccdd', 'ee']]
编辑:这是一个使用filter
的版本,但不会在表达式中复制两次结果,并且具有更好的格式:
>>> filter(
lambda res: all(1 <= len(s) <= str_len for s in res),
[[''.join(list_string[:i]), ''.join(list_string[i:])]
for i in xrange(len(list_string))])
[['aaabb', 'ccddee']]
答案 1 :(得分:1)
from itertools import combinations
list_string = [ "aaa", "bb", "cc", "dd", "ee"]
minn=min(map(len,list_string))
maxx=max(map(len,list_string))
str_len=6
lis=[''.join(x) for i in range(1,maxx+1) for x in combinations(list_string,i) if len(''.join(x))<=str_len]
print lis
<强>输出:强>
['aaa', 'bb', 'cc', 'dd', 'ee', 'aaabb', 'aaacc', 'aaadd', 'aaaee', 'bbcc', 'bbdd', 'bbee', 'ccdd', 'ccee', 'ddee', 'bbccdd', 'bbccee', 'bbddee', 'ccddee']