Использование вложенных циклов в порядке, если ваши списки довольно малы, но вскоре они становятся неэффективными для больших списков. Например, если len (list1) == 10 и len (list2) == 20, код внутри внутреннего цикла выполняется 200 раз.
Вот алгоритм, который строит нужный список кортежей через словарь. Словарь хранит данные кортежа в списках, потому что он более эффективен: его можно добавлять к спискам, тогда как кортежи неизменяемы, поэтому каждый раз, когда вы добавляете элемент в конец кортежа с помощью i = i + (j[0],)
, вы фактически создаете новый объект кортежа (а также временный набор (j[0],)
) и отбрасывание старого, связанного с i
.
list1 = [('abc', 1), ('def', 2), ('ghi', 3)]
list2 = [
(1000, 'abc'),
(2000, 'def'),
(2100, 'def'),
(3000, 'ghi'),
(3100, 'ghi'),
(3200, 'ghi'),
]
# Insert list1 data into a dict of lists
d = {t[0]:list(t) for t in list1}
# Append list2 data to the correct list
for v, k in list2:
d[k].append(v)
# Convert lists back into tuples, using the key order from list1
result = [tuple(d[k]) for k, _ in list1]
for t in result:
print(t)
выход
('abc', 1, 1000)
('def', 2, 2000, 2100)
('ghi', 3, 3000, 3100, 3200)
С помощью этого алгоритма, если Len (песни1) == 10 и LEN (песни2) == 20 то есть цикл длины 10, чтобы построить словарь d
, цикл длиной 20, чтобы добавить данные списка2 в списки d
и еще один цикл длиной 10, чтобы построить окончательный список кортежей. он делает шаги внутри каждой из этих циклов, довольно простой, примерно наравне с вашим i = i + (j[0],)
, и, очевидно, 40 шагов намного лучше 200. И, конечно, если в списках входных данных было 1000 элементов каждый, тогда мой код займет 3000 циклов, в отличие от один миллион циклов, необходимых для подхода вложенных циклов.
Следует также упомянуть, что этот код поднимет KeyError
, если list2
содержит ключ, который находится не в list1
. Предположительно, это не проблема для данных, которые вы обрабатываете, так как ваш код (и Sevanteri) молча игнорирует такие ключи. Если вам do нужно обрабатывать такие ключи, это довольно просто сделать, но это делает мой list2
цикл более простым & более эффективным, если ему не нужно обрабатывать недостающие ключи.
Использование вложенных циклов для этого не является хорошей идеей, если списки большие. Подробнее см. Ниже. –