簡體   English   中英

Python:獲取列表的順序元素的所有組合

[英]Python: Get all combinations of sequential elements of list

給定一個數組,說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還是應該編寫自定義函數?

嘗試使用yield

x = ['A','I','R']

def groupme(x):
    s = tuple(x)
    for size in range(1, len(s) + 1):
        for index in range(len(s) + 1 - size):
            yield list(x[index:index + size])

list(groupme(x))

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

是的,您可以使用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']]

信用: hochl回答

不要試圖變得如此神奇:兩個循環可以完成您想要的; 一個超過可能的序列開始,內部超過可能的序列長度:

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

使用列表理解:

letters=['A', 'I', 'R']
[letters[start:end+1] 
 for start in xrange(len(letters)) 
 for end in xrange(start, len(letters))]

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

如果擁有建議的順序很重要(從最長到最短,並且起始位置的長度相同),則可以改為:

[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的評論。 如果不是使用列表推導,而是使用生成器表達式(僅將外部[]替換為() ),則所需的內存將大大減少。 但是在這種情況下,您必須小心不要多次使用結果,或者例如不要嘗試在結果上使用列表方法(例如len或刪除元素)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM