[英]Iterate over two lists with different lengths
我有2個不同長度的數字列表,例如:
list1 = [1, 2, -3, 4, 7]
list2 = [4, -6, 3, -1]
我需要使用函數迭代這些:
final_list = []
for index in range(???):
if list1[index] < 0:
final_list.insert(0, list1[index])
elif list1[index] > 0:
final_list.insert(len(final_list), list1[index])
if list2[index] < 0:
final_list.insert(0, list2[index])
elif list2[index] > 0:
final_list.insert(len(final_list), list2[index])
return final_list
但無法弄清楚如何處理范圍,因為如果我使用max
長度,較短的列表將變得“超出范圍”。 有關如何克服這個或如何改變我的功能的任何想法?
itertools.zip_longest(*iterables, fillvalue=None)
將為您完成工作:
如果迭代的長度不均勻,則使用fillvalue填充缺失值。
對於您的示例列表,這將產生:
>>> import itertools
>>> list1 = [1, 2, -3, 4, 7]
>>> list2 = [4, -6, 3, -1]
>>> for combination in itertools.zip_longest(list1, list2):
print(combination)
(1, 4)
(2, -6)
(-3, 3)
(4, -1)
(7, None)
如果您只想使用兩個列表中存在的值,請使用內置的zip()
:
當最短輸入可迭代用盡時,迭代器停止。
>>> for combination in zip(list1, list2):
print(combination)
(1, 4)
(2, -6)
(-3, 3)
(4, -1)
可以通過使用處理從列表中相鄰的項目itertools.zip_longest()
itertools.izip_longest()
以產生成對的項的順序,如果使用Python 2)。 對於不匹配長度的列表,對將填充None
。
然后,您可以通過展平配對項的序列並過濾掉None
值來簡化循環體中的代碼,在您的情況下,過濾掉0
值。 這就是下面的生成器表達式。
然后,如果分別大於或小於零,則只需將值附加或插入到final_list
。
在代碼中:
from itertools import zip_longest
final_list = []
for value in (i for pair in zip_longest(list1, list2) for i in pair if i):
if value > 0:
final_list.append(value)
else:
final_list.insert(0, value)
print(final_list)
[-1, -3, -6, 1, 4, 2, 3, 4, 7]
請注意,這將過濾掉列表中可能存在的任何零值。 如果要保留這些,請修改生成器表達式以僅過濾掉None
值:
(i for pair in zip_longest(list1, list2)
for i in pair if i is not None)
並修改循環體以在final_list
任何位置插入0
。
在您的情況下,您應該只檢查索引是否比序列長:
list1 = [1, 2, -3, 4, 7]
list2 = [4, -6, 3, -1]
final_list = []
for index in range(max(len(list1), len(list2))):
if index < len(list1):
if list1[index] < 0:
final_list.insert(0, list1[index])
elif list1[index] > 0:
final_list.insert(len(final_list), list1[index])
if index < len(list2):
if list2[index] < 0:
final_list.insert(0, list2[index])
elif list2[index] > 0:
final_list.insert(len(final_list), list2[index])
print(final_list)
# [-1, -3, -6, 1, 4, 2, 3, 4, 7]
或者使用itertools.zip_longest
(或python-2.x上的itertools.izip_longest
)並檢查一些fillvalue(即None
):
import itertools
list1 = [1, 2, -3, 4, 7]
list2 = [4, -6, 3, -1]
final_list = []
for item1, item2 in itertools.zip_longest(list1, list2, fillvalue=None):
if item1 is None:
pass
elif item1 < 0:
final_list.insert(0, item1)
elif item1 > 0:
final_list.append(item1)
if item2 is None:
pass
elif item2 < 0:
final_list.insert(0, item2)
elif item2 > 0:
final_list.append(item2)
但是當你的方法是== 0
,你的方法會跳過這些項目,這可能是一種疏忽,但是你應該用零來檢查它是否正常工作。
你也經常使用insert
。 最后一個elif
可以改為使用final_list.append(item1)
(或item2
),就像我在第二個例子中所做的那樣。
在這種情況下, item1
和item2
的處理是相同的,因此您可以使用另一個循環:
import itertools
list1 = [1, 2, -3, 4, 7]
list2 = [4, -6, 3, -1]
final_list = []
for items in itertools.zip_longest(list1, list2, fillvalue=None):
for item in items:
if item is None:
pass
elif item < 0:
final_list.insert(0, item)
elif item > 0:
final_list.append(item)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.