Python, соответствующий двум спискам

#python #list #loops

Вопрос:

У меня есть два списка:

 list1 = [[0, 5], [5, 115], [115, 219], [219, 262], [262, 328], [328, 408], [408, 424], [424, 531], [531, 562], [562, 620], [620, 676], [676, 781], [781, 805], [805, 808], [808, 919], [919, 1009], [1009, 1112], [1112, 1183], [1183, 1241], [1241, 1254], [1254, 1283], [1283, 1323], [1323, 1346], [1346, 1362], [1362, 1383], [1383, 1472], [1472, 1548], [1548, 1559], [1559, 1578], [1578, 1600], [1600, 1642], [1642, 1693], [1693, 1700], [1700, 1763], [1763, 1843], [1843, 1861], [1861, 1966], [1966, 1982], [1982, 2135], [2135, 2150], [2150, 2159], [2159, 2197], [2197, 2233], [2233, 2253], [2253, 2301], [2301, 2358], [2358, 2377], [2377, 2394], [2394, 2419], [2419, 2438], [2438, 2453], [2453, 2486], [2486, 2506], [2506, 2515], [2515, 2528], [2528, 2554], [2554, 2559], [2559, 2577], [2577, 2637], [2637, 2694], [2694, 2716], [2716, 2737], [2737, 2764], [2764, 2777], [2777, 2779], [2779, 2779]]
 

и

 list2 = [[0, 145, 0], [145, 169, 1], [169, 1693, 3], [1693, 1708, 1], [1708, 2729, 3], [2729, 2779, 0]]
 

Я хочу сопоставить их, как если бы list1[1] был равен или находился между list2[1], он берет третье значение в скобках и добавляет их в список в list1 (извините, мой английский плохой!) Если он явно не соответствует единице, добавьте значение 2. Результат должен выглядеть так:

 list1 = [[0, 5, 0], [5, 115, 0], [115, 219, 2], [219, 262, 3], [262, 328, 3], [328, 408, 3], [408, 424, 3], [424, 531, 3], [531, 562, 3], [562, 620, 3], [620, 676, 3], [676, 781, 3], [781, 805, 3], [805, 808, 3], [808, 919, 3], [919, 1009, 3], [1009, 1112, 3], [1112, 1183, 3], [1183, 1241, 3], [1241, 1254, 3], [1254, 1283, 3], [1283, 1323, 3], [1323, 1346, 3], [1346, 1362, 3], [1362, 1383, 3], [1383, 1472, 3], [1472, 1548, 3], [1548, 1559, 3], [1559, 1578, 3], [1578, 1600, 3], [1600, 1642, 3], [1642, 1693, 3], [1693, 1700, 1], [1700, 1763, 2], [1763, 1843, 3], [1843, 1861, 3], [1861, 1966, 3], [1966, 1982, 3], [1982, 2135, 3], [2135, 2150, 3], [2150, 2159, 3], [2159, 2197, 3], [2197, 2233, 3], [2233, 2253, 3], [2253, 2301, 3], [2301, 2358, 3], [2358, 2377, 3], [2377, 2394, 3], [2394, 2419, 3], [2419, 2438, 3], [2438, 2453, 3], [2453, 2486, 3], [2486, 2506, 3], [2506, 2515, 3], [2515, 2528, 3], [2528, 2554, 3], [2554, 2559, 3], [2559, 2577, 3], [2577, 2637, 3], [2637, 2694, 3], [2694, 2716, 3], [2716, 2737, 2], [2737, 2764, 0], [2764, 2777, 0], [2777, 2779, 0], [2779, 2779, 0]]
 

Я не могу понять, как это сделать — можно ли это сделать с помощью цикла — любой намек очень ценится — спасибо!

Ответ №1:

На самом деле это не так уж и сложно. Просто напишите шаги, которые вы бы предприняли, если бы были человеком-компьютером, и научите Python, как это делать:

 for l in list1:
    for m in list2:
        if m[0] <= l[1] <= m[1]:
            l.append(m[2])
            break
 

Комментарии:

1. спасибо за ваш ответ — это выглядит действительно хорошо. Еще один вопрос, если можно: если list1 =[[0,0]] и list2= [], как я могу с этим справиться? Я попытался добавить попытку/исключение, но я могу добавить, чтобы пропустить, если l2 пуст, верно?

2. Каким ты хочешь, чтобы был ответ? Это не входило в спецификацию. Этот код не вызовет исключения, но он также не изменит исходный список.