Python - 合并两个2D列表,覆盖一个值

时间:2015-08-19 16:39:17

标签: python list

我有两个二维列表

list 1 = [[None, None], [None, None], [None, None]]
list 2 = [[1, 2], [3, 4]]

所需的输出是

list 3 = [[1, 2], [3, 4], [None, None]]

如果有一个更简单的解决方案,我这样做是因为我并不总是拥有列表中第三个元素的数据。我需要列表总是有三个第一级项目。我正试图阻止我的脚本抛出out of range错误。

希望能够解决以下问题的其他背景。

当我的应用程序在数据库查询返回放入列表的结果时出现这种情况,例如: '最大的10个问题'。有时事情并不那么糟糕,只有9个问题。

当应用程序的另一部分查找第10个问题(Flask网站)时,它会抛出错误。尝试/除外确实有用,但会很重。

所以我需要一个解决方案,我可以创建一个占位符值列表,并用数据覆盖它们。如果可用的话。

只需一行代码即可接受解决方案。

6 个答案:

答案 0 :(得分:2)

我认为这就是你的意思

list_3 = [ list_2[i] if i < len(list_2) else e for i,e in enumerate(list_1) ]

这里是没有列表理解的等价物

list_3 = list()
for i,e in enumerate(list_1):
    if i < len(list_2):
        list_3.append(list_2[i])
    else:
        list_3.append(e)

答案 1 :(得分:2)

我不确定我完全理解你的问题,但我想你可能想要这个:

list1 = [[None, None], [None, None], [None, None]]
list2 = [[1, 2], [3, 4]]
list3 = list2 + list1[len(list2):]

在第三行中,list2中的所有元素将替换list1中的len(list2)元素,但保持其余元素不变。如果这是你想要的,你应该确保list1的长度不小于list2,否则它会引发IndexError

答案 2 :(得分:0)

您无需创建新列表。只需使用以下内容即可访问list2

的元素
list2[10] if 10 < len(list2) else [None, None]

我已经将索引用作下面的10,但在你的情况下,它很可能是一个变量:

list2[i] if i < len(list2) else [None, None]

答案 3 :(得分:0)

如果您想对两个列表执行某些操作,请考虑使用itertools.izip_longest进行组合。

In [1]: list1 = [[None, None], [None, None], [None, None]]

In [2]: list2 = [[1, 2], [3, 4]]

In [3]: import itertools

In [8]: [a for a, b in itertools.izip_longest(list2, list1, fillvalue=[None, None])]
Out[8]: [[1, 2], [3, 4], [None, None]]

请注意,在Python 3中,名称为itertools.zip_longest

答案 4 :(得分:0)

你可以这样做:

list_3 = list_2 + list_1[len(list_2):]

但我不确定需要做些什么。

答案 5 :(得分:0)

您可以使用首先生成list_2元素然后生成None值的生成器。然后,只需从该生成器中获取前3个元素。

from itertools import chain, islice, repeat
list_2 = [[1, 2], [3, 4]]
list_3 = list(
    islice(
        chain(
            list_2,
            repeat(None)
        ),
        3))

但您可能面临典型的数据丢失问题。如果您要处理大量数据,我建议您使用Pandas。以下是Pandas文档中的相关文字:http://pandas.pydata.org/pandas-docs/stable/missing_data.html