Судя по вашему описанию, редактированию и комментариям, оно не похоже на dict.update()
, которое даст вам желаемые результаты.
Ошибка, которую вы нажимаете, заключается в том, что l oop создает предположение о количестве элементов, которые будут повторяться после запуска. В течение l oop вы меняете это число, отменяя предположение и вызывая сбой программы.
Чтобы исправить это, вам нужно вместо этого выполнить итерацию копии элементов. Вы также упомянули, что вас интересуют значения, а не ключи, поэтому вам нужно настроить что вы итерируете.
Теперь вы на самом деле не публиковали то, что overlap
функция делает, поэтому я предполагаю что-то подобное на основе ваших комментариев / образца:
def overlap(left, right):
return left[0] - right[-1] == 1
По большей части, фактическая реализация вашего overlap
не имеет отношения к вопросу, но приведенный выше код, по крайней мере, дал мне ожидаемый результат.
Затем я настроил ваш код следующим образом:
for v1 in list(d1.values()):
for v2 in list(d2.values()):
# If v1 overlaps v2
if overlap(v1, v2):
# Add v1 to d2 under the next sequential key
d2[len(d1) + 1] = v1
Используя list(d1.values())
, я больше не выполняю итерации сам словарь при его изменении - я делаю «снимок» содержимого (значения здесь указаны) в начале l oop.
Используя это и ваши примеры данных, d2
содержит {1: [1, 5], 2: [6, 10], 3: [11, 15]}
после l oop.