Ответ 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]
Я новичок в 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
.
Вы можете создать словарь из 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]
Я всегда использовал бы решение 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]