2012-05-19 60 views
1

嘿,我正在使用python,我只是想知道我們如何能夠從原始元素列表中組合特定長度的列表?例如,我有一個原始列表["2H", "AH", "KH", "QH", "JH", "0H", "9H"],有沒有什麼辦法可以創建一個最終列表,其中包含所有新的特定長度的列表(35)?將列表中的元素分配到特定長度的列表中

基本上從上面的原始列表,我想返回的列表如下圖所示:

[['9H', '0H', 'JH'], ['0H', 'JH', 'QH'], ['JH', 'QH', 'KH'], ['QH', 'KH', 'AH'], 
['KH', 'AH', '2H'], ['9H', '0H', 'JH', 'QH'], ['0H', 'JH', 'QH', 'KH'], 
['JH', 'QH', 'KH', 'AH'], ['QH', 'KH', 'AH', '2H'], ['9H', '0H', 'JH', 'QH', 'KH'], 
['0H', 'JH', 'QH', 'KH', 'AH'], ['JH', 'QH', 'KH', 'AH', '2H']] 

謝謝!

回答

3
>>> from itertools import islice, chain 
>>> L = ["2H", "AH", "KH", "QH", "JH", "0H", "9H"] 
>>> list(chain.from_iterable(
     zip(*[islice(reversed(L),i,None) for i in range(j)]) 
     for j in range(3,6))) 
[('9H', '0H', 'JH'), ('0H', 'JH', 'QH'), ('JH', 'QH', 'KH'), ('QH', 'KH', 'AH'), 
('KH', 'AH', '2H'), ('9H', '0H', 'JH', 'QH'), ('0H', 'JH', 'QH', 'KH'), 
('JH', 'QH', 'KH', 'AH'), ('QH', 'KH', 'AH', '2H'), ('9H', '0H', 'JH', 'QH', 'KH'), 
('0H', 'JH', 'QH', 'KH', 'AH'), ('JH', 'QH', 'KH', 'AH', '2H')] 

說明

此解決方案基於使用zip

>>> zip(L,L) 
[('2H', '2H'), ('AH', 'AH'), ('KH', 'KH'), ('QH', 'QH'), ('JH', 'JH'), ('0H', '0H'), ('9H', '9H')] 

這顯示了一個例子,說明zip工作,採取一個項目從它的每一個paramters在一起。

>>> zip(L,L[1:]) 
[('2H', 'AH'), ('AH', 'KH'), ('KH', 'QH'), ('QH', 'JH'), ('JH', '0H'), ('0H', '9H')] 

通過從第二個參數列表中的第一個項目開始,您可以獲得每兩個項目。

>>> zip(L,L[1:],L[2:]) 
[('2H', 'AH', 'KH'), ('AH', 'KH', 'QH'), ('KH', 'QH', 'JH'), ('QH', 'JH', '0H'), ('JH', '0H', '9H')] 

相同3件物品。

>>> zip(*[L[i:] for i in range(3)]) 
[('2H', 'AH', 'KH'), ('AH', 'KH', 'QH'), ('KH', 'QH', 'JH'), ('QH', 'JH', '0H'), ('JH', '0H', '9H')] 

要做到這一點自動您可以使用*(圖示)從列表中理解得到zip的論點。

在該示例中,結果相反,因此reversed給出了列表中的反向迭代器。要切片迭代器,必須使用來自itertools的isliceislice以可迭代的形式跟隨索引開始切片和索引以結束它。可以使用None一直到迭代結束。

>>> zip(*[islice(reversed(L),i,None) for i in range(3)]) 
[('9H', '0H', 'JH'), ('0H', 'JH', 'QH'), ('JH', 'QH', 'KH'), ('QH', 'KH', 'AH'), ('KH', 'AH', '2H')] 

這樣就給出了每3個項目的所有結果。現在每4件和5件都需要,因此該操作是針對range(3),range(4)range(5)執行的。

(zip(*[islice(reversed(L),i,None) for i in range(j)]) for j in range(3,6)) 

這將使發電機與每個345列表,但他們需要的所有一個列表。它們可以與chain.from_iterable鏈接在一起,結果被轉換爲list

+0

我愛你。非常感謝! –

+0

只是想知道你有什麼辦法可以聯繫你嗎? Facebook的? –

+0

@AdhyKarina哈哈哈我不知道該說什麼,歡迎您:D與我聯繫是什麼原因?我不需要任何東西,謝謝是足夠的:) – jamylak

-1

使用itertools

import itertools 

original = ["2H", "AH", "KH", "QH", "JH", "0H", "9H"] 

result = itertools.chain() 
for size in range(3, 6): 
    curr_subsets = itertools.combinations(original, size) 
    result = itertools.chain(result, curr_subsets) 

result_as_list = list(result) 
+0

這不起作用。它不會產生問題中列出的正確輸出。 – jamylak

+0

它可能不會產生相同的輸出,但它肯定會產生「原始元素列表中特定長度列表的組合」。由OP精確指定他們想要的內容。如果訂購是相關的,那麼在帖子的任何地方都沒有說明。 – bossylobster

+1

「組合」一詞的使用可能會產生誤導,他只希望列表中的每個3,4和5項。他在上面列出的期望產出中確切地指定了他想要的東西。 – jamylak

相關問題