将一个列表与一个元组列表进行比较,以获得另一个列表。

11

我是Python新手,所以可能会问些天真的问题。我有一个列表

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

还有一个元组列表

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

我想输出一个大小为l1的列表l3,将l1的值与l2的第一坐标进行比较,如果在l1中找到了第一坐标,则将第二坐标存储在l3中,否则存储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
显然,这是因为l2l1短。

1
l2中是否会出现多个元组具有相同的第一个元素的情况?如果是,那么规则是什么? - jedwards
3
看起来 l2 应该是一个字典而不是一个列表。 - Patrick Haugh
@jedwards 不会有多个相同的第一个元素。 - Jenny
3
做得好,您提出了一个合理的问题,并提供了适当格式化的代码、输入数据、所需输出和错误消息。这在stackoverflow上非常罕见。请多提出像这样的问题! - quamrana
2个回答

11
你可以从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]

2
优雅的解决方案,天真的方法是在循环内部使用另一个循环。 - Abhijeet Khangarot

1

我通常会使用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]

@Jenny 很高兴能帮到你!请注意,我已经添加了另一种使用next()的方法,应该比以前的方法更优雅。确保也要查看一下它,因为这个函数在Python中可能特别有用。 - Mr. Xcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接