Скажем, у меня есть массив/список вещей, которые я хочу сравнить. На языках, с которыми я знаком, я бы сделал что-то вроде
for (int i = 0, i < mylist.size(); i++)
for (int j = i + 1, j < mylist.size(); j++)
compare(mylist[i], mylist[j])
Это гарантирует, что мы сравниваем каждую пару раз. В каком-то контексте я выполняю обнаружение столкновений в связке объектов, содержащихся в списке. Для каждого обнаруженного столкновения в список добавляется небольшой объект "столкновения", описывающий столкновение, который затем выполняет другую процедуру, разрешая каждое столкновение (в зависимости от характера двух сталкивающихся объектов). Очевидно, я хочу только сообщать о каждом столкновении один раз.
Теперь, что такое питонический способ сделать это, поскольку Python предпочитает использовать итераторы, а не перебирать индексы?
У меня был следующий (багги) код:
for this in mylist:
for that in mylist:
compare(this, that)
Но это явно захватывает каждое столкновение дважды, что приводит к некоторому странному поведению при попытке их разрешить. Итак, каково здесь питоновское решение?