>>> 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))
这将为生成器提供每个 , 的列表3
,4
但5
它们必须是一个列表。它们可以链接在一起,chain.from_iterable
并将结果转换为list
.