将列表中的元素分配到特定长度的列表列表中

时间:2012-05-19 02:39:20

标签: python list sorting split

嘿伙计我正在使用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']]

谢谢!

2 个答案:

答案 0 :(得分: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如何工作的示例,方法是将每个参数中的项目放在一起。

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

通过从与第二个参数相同的列表的第一项开始,您可以获得每2项。

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

要自动执行此操作,您可以使用*(splat)从列表推导中获取zip的参数。

在示例中,结果反过来,因此reversed通过列表提供反向迭代器。要对迭代器进行切片,必须使用来自itertools的isliceislice使用iterable,后跟索引来启动切片,使用索引来结束切片。 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

答案 1 :(得分:-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)