Сравните список со списком кортежей, чтобы получить другой список

Я новичок в 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]

Я устал делать цикл для:

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.

Ответы

Ответ 1

Вы можете создать словарь из 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

Я всегда использовал бы решение Ajax1234, но я хотел бы проиллюстрировать, как я буду обращаться к нему, используя for-loop, как вы и предполагали:

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-loop. Это намного эффективнее и удобочитаемо:

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