Python:列表理解,从随机大小的字符串列表中创建n个最大值的列表字符串

时间:2012-07-13 20:21:16

标签: python string list list-comprehension

这个想法是创建一个包含一定数量字符的字符串列表,保留原始列表中的顺序。挑战是仅使用列表推导来实现它。

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"]

2 个答案:

答案 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']