АНАЛИЗ
Ваша основная проблема заключается в том, что вы нарушаете базовую практику: не изменяйте итерацию, пока вы ее повторяете. Ваш внешний цикл запускает i
через значения 0-5. Однако к тому времени, как вы доберетесь до 4, у вас больше не будет пункта № 4 в списке. Я сделал несколько простых трассировок вашего кода, включая лучшее сообщение об ошибке:
except IndexError:
print "ERROR", i, j, listoflist
Выход:
ERROR 4 1 [[1, 2, 3, 1, 1, 9, 9, 1, 7, 8], [4, 5, 6, 4, 3, 2], [5, 5, 8], [2, 2, 0]]
РЕМОНТ
Не изменяйте исходный список. Вместо этого создайте новый список из старого. Соберите все списки, которые начинаются с одного и того же элемента; добавьте полученный набор к нужному результату.
listoflist = [[1,2,3,1],[4,5,6],[1,7,8],[4,3,2],[5,5,8],[2,2,0],[1,9,9]]
result = []
try:
for i in range(len(listoflist)):
x = listoflist[i][0]
if x < 0: # Skip any sub-list already used
continue
gather = listoflist[i][:] # Copy list for processing
for j in range(len(listoflist)-1,0,-1):
if x == listoflist[j][0] and i != j:
gather.extend(listoflist[j])
listoflist[j][0] = -j # Uniquely mark this as not in use.
print i, j, gather
result.append(list(set(gather)))
print i, result
print result
except IndexError:
print "ERROR", i, j, listoflist
Да, это все еще намного дольше, чем нужно; если вы действительно хотите копаться в Python, вы можете сгруппировать списки по первому элементу и выполнить всю обработку в одну длинную строку. Я пытался сделать это более доступным для вас.