2012-05-19 29 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

相关问题