问题 将列表与元组列表进行比较以获取另一个列表


我是python的新手,所以对这个天真的问题道歉。我有一份清单

l1 = [2, 4, 6, 7, 8] 

和另一个元组列表

l2 = [(4,6), (6,8), (8,10)]

我想输出一个列表 l3 大小 l1 比较的价值 l1 到第一个坐标 l2 如果找到第一个坐标,则存储第二个坐标 l1,否则存储0。

输出:

l3 = [0, 6, 8, 0, 10]

我厌倦了做一个for循环,如:

l3 = []
for i in range(len(l1)):
   if l1[i] == l2[i][0]:
      l3.append(l2[i][1])
   else:
      l3.append(0)  

但这不起作用。它给出了错误

IndexError: list index out of range

这很明显 l2 比...短 l1


5022
2018-06-12 19:37


起源

是否会出现多个元组的情况 l2 拥有相同的第一元素?如果是这样,那里的规则是什么? - jedwards
看起来像 l2 应该是字典而不是列表。 - Patrick Haugh
@jedwards没有它不会有多个相同的第一个元素。 - Jenny
做得好用于使用格式正确的代码,输入数据,所需输出来提出合理的问题 和 错误消息。这在stackoverflow上非常罕见。请问更多这样的问题! - quamrana


答案:


您可以从中创建字典 l2

l1 = [2,4,6,7,8] 
l2 =[(4,6),(6,8),(8,10)]
new_l2 = dict(l2)
l3 = [new_l2.get(i, 0) for i in l1]

输出:

l3 = [0,6,8,0,10]

11
2018-06-12 19:40



优雅的解决方案,天真的方法将在循环内使用循环。 - jokerster
嗨@Robᵩ完成了!谢谢 - Jenny


我总是会用 Ajax1234的解决方案 相反,但我想说明如何使用for循环来处理它,如你所愿:

l3 = []
for elem in l1:
    pairs = list(filter(lambda x: x[0] == elem, l2))
    l3.append(pairs[0][1] if pairs else 0)

另一种方法是使用 next() 和列表理解而不是 filter() 和一个for循环。这个更有效率和可读性:

l3 = [next((u[1] for u in l2 if u[0] == elem), 0) for elem in l1]

1
2018-06-12 19:53



@Jenny我很高兴它有帮助!请注意,我添加了另一种方法 next(),它应该比前一个更优雅。一定要检查一下,因为这个函数在Python中特别有用。 - Mr. Xcoder