我有两个二维列表
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网站)时,它会抛出错误。尝试/除外确实有用,但会很重。
所以我需要一个解决方案,我可以创建一个占位符值列表,并用数据覆盖它们。如果可用的话。
只需一行代码即可接受解决方案。
答案 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