Python:获取列表的顺序元素的所有组合

时间:2015-10-01 08:40:45

标签: python itertools

给定数组说x = ['A','I','R'] 我希望输出为

[['A','I','R'],['A','I'],['I','R'],['A'],['I'],['R']]

我不想要的输出是:

[['A','I','R'],['A','I'],['I','R'],['A','R'],['A'],['I'],['R']]  # extra ['A','R'] which is not in sequence .

以下是提供我不想要的输出的代码:

letter_list = [a for a in str]
all_word = []
for i in xrange(0,len(letter_list)):
    all_word = all_word + (map(list, itertools.combinations(letter_list,i))) # dont use append. gives wrong result.
all_word = filter(None,all_word) # remove empty combination
all_word = all_word + [letter_list] # add original list

我的观点是我只想要序列的组合。有没有办法使用itertools或者我应该编写自定义函数吗?

4 个答案:

答案 0 :(得分:3)

尝试使用df$X

yield

答案 1 :(得分:2)

是的,您可以使用itertools

>>> x = ['A', 'I', 'R']
>>> xs = [x[i:j] for i, j in itertools.combinations(range(len(x)+1), 2)]
>>> xs
[['A'], ['A', 'I'], ['A', 'I', 'R'], ['I'], ['I', 'R'], ['R']]
>>> sorted(xs, key=len, reverse=True)
[['A', 'I', 'R'], ['A', 'I'], ['I', 'R'], ['A'], ['I'], ['R']]

信用:answer by hochl

答案 2 :(得分:1)

不要试图如此神奇:两个循环会做你想要的;一个可能的序列开始,内部可能的序列长度:

x = "AIR" # strings are iterables/sequences, too!
all_words = []
for begin in xrange(len(x)):
    for length in xrange(1,len(x) - begin+1):
        all_words.append(x[begin:begin+length])

答案 3 :(得分:0)

使用列表理解:

[letters[start:start+l+1]
 for l in range(len(letters))[::-1]
 for start in xrange(len(letters)-l)]

[['A', 'I', 'R'], ['A', 'I'], ['I', 'R'], ['A'], ['I'], ['R']]

如果您建议的订单很重要(从最长到最短,并且在起始位置时长度相同),您可以这样做:

[]

只是为了解决Holroy的评论。如果不使用列表推导而是使用生成器表达式(只需用()替换外部{{1}}),您将获得更少的内存需要代码。但在这种情况下,您必须小心不要多次使用结果,或者例如不尝试在结果上使用列表方法(例如len或删除元素)。