簡體   English   中英

迭代兩個不同長度的列表

[英]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 ),就像我在第二個例子中所做的那樣。

在這種情況下, item1item2的處理是相同的,因此您可以使用另一個循環:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM