1

嘿伙计们,我正在使用 python,我只是想知道我们如何从原始元素列表中组合特定长度的列表?例如,我有一个原始列表["2H", "AH", "KH", "QH", "JH", "0H", "9H"],我有什么办法可以创建一个最终列表,其中包含所有特定长度 ( 3to 5) 的新分类列表?

基本上从上面的原始列表中,我想要一个返回的列表,如下所示:

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

谢谢!

4

2 回答 2

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在列表中提供了一个反向迭代器。要对迭代器进行切片,islice必须使用 from itertools。islice采用 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.

于 2012-05-19T05:48:30.827 回答
-1

使用迭代工具

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)
于 2012-05-19T05:49:05.160 回答