嘿伙计我正在使用python而我只是想知道如何从原始元素列表中组合特定长度的列表?例如,我有一个原始列表["2H", "AH", "KH", "QH", "JH", "0H", "9H"]
,有没有办法让我创建一个最终列表,其中包含特定长度(3
到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']]
谢谢!
答案 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的islice
。 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))
这会为生成器提供每个3
,4
和5
的列表,但它们必须是一个列表。它们可以与chain.from_iterable
链接在一起,结果转换为list
。
答案 1 :(得分:-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)