這個問題有點類似于這個問題,但不同的是它需要多個串列:
我有三個清單:
a = [1, 2, 3, 4, 5, 6, 7]
b = ['ball', 'cat', 'dog', 'elephant', 'baboon', 'crocodile']
c = [6, 3, 5, 4, 3, 2, 1]
我正在遍歷串列如下:
for (x, y, z) in itertools.product(a, b, c):
print("The combination is: " str(x) ", " y ", " str(z))
我想添加一個條件,用以下偽代碼表示:
for (x, y, z) in itertools.product(a, b, c):
if x != z:
print("The combination is: " str(x) ", " y ", " str(z))
if x == z:
skip to the next element in list "a" without skipping elements of "b" & "c" # this is pseudo code
我怎么能做到這一點?itertools 中是否有可用于完成此操作的函式?
uj5u.com熱心網友回復:
假設我正確解釋了您的問題(您想跳到下一個a元素,而不重置b/c回圈中的偏移量product(a, b, c)),這應該可以解決問題。它不像您喜歡的那樣專注于 itertools,但它確實有效,而且速度不應太慢。據我所知, itertools 沒有任何東西可以滿足您的要求,至少不是開箱即用的。大多數函式(islice作為一個主要示例)只是跳過元素,這仍然會消耗時間。
from itertools import product
def mix(a, b, c):
a_iter = iter(a)
for x in a_iter:
for y, z in product(b, c):
while x == z:
x = next(a_iter)
yield x, y, z
輸出:
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> b = ['ball', 'cat', 'dog', 'elephant', 'baboon', 'crocodile']
>>> c = [6, 3, 5, 4, 3, 2, 1]
>>> pprint(list(mix(a, b, c)))
[(1, 'ball', 6),
(1, 'ball', 3),
(1, 'ball', 5),
(1, 'ball', 4),
(1, 'ball', 3),
(1, 'ball', 2),
(2, 'ball', 1),
(2, 'cat', 6),
(2, 'cat', 3),
(2, 'cat', 5),
(2, 'cat', 4),
(2, 'cat', 3),
(3, 'cat', 2),
(3, 'cat', 1),
(3, 'dog', 6),
(4, 'dog', 3),
(4, 'dog', 5),
(5, 'dog', 4),
(5, 'dog', 3),
(5, 'dog', 2),
(5, 'dog', 1),
(5, 'elephant', 6),
(5, 'elephant', 3),
(6, 'elephant', 5),
(6, 'elephant', 4),
(6, 'elephant', 3),
(6, 'elephant', 2),
(6, 'elephant', 1),
(7, 'baboon', 6),
(7, 'baboon', 3),
(7, 'baboon', 5),
(7, 'baboon', 4),
(7, 'baboon', 3),
(7, 'baboon', 2),
(7, 'baboon', 1),
(7, 'crocodile', 6),
(7, 'crocodile', 3),
(7, 'crocodile', 5),
(7, 'crocodile', 4),
(7, 'crocodile', 3),
(7, 'crocodile', 2),
(7, 'crocodile', 1)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/385130.html
標籤:Python for循环 迭代 迭代工具 更多itertools
上一篇:串列索引必須不是串列
