迭代两个不同长度的列表

时间:2017-05-16 11:52:49

标签: python list loops

我有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

但无法弄清楚如何处理范围,因为较短的列表将变得超出范围&#34;如果我使用max长度。关于如何克服这个或如何改变我的功能的任何想法?

3 个答案:

答案 0 :(得分:5)

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)

答案 1 :(得分:2)

您可以使用itertools.zip_longest()then,如果使用Python 2)来处理列表中的相邻项,以生成一系列配对项。对于itertools.izip_longest()填充,对于不匹配长度的列表,将填充对。

然后,您可以通过展平配对项的序列并过滤掉None值(在您的情况下为None值)来简化循环体中的代码。这就是下面的生成器表达式。

然后,如果分别大于或小于零,则只需将值附加或插入0

在代码中:

final_list
[-1, -3, -6, 1, 4, 2, 3, 4, 7]

请注意,这将过滤掉列表中可能存在的任何零值。如果要保留这些值,请修改生成器表达式以仅过滤掉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) 值:

None

并修改循环体,将(i for pair in zip_longest(list1, list2) for i in pair if i is not None) 插入0中的任何位置。

答案 2 :(得分:1)

在你的情况下,你应该只检查索引是否比序列长:

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(或itertools.izip_longest在python-2.x上)并检查一些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)