Перечислите (элемент, другие) в списке

Предположим, у меня есть список:

l = [0, 1, 2, 3]

Как я могу перебирать список, беря каждый элемент вместе со своим дополнением из списка? То есть

for item, others in ...
    print(item, others)

будет печатать

0 [1, 2, 3]
1 [0, 2, 3]
2 [0, 1, 3]
3 [0, 1, 2]

В идеале я ищу краткое выражение, которое я могу использовать в понимании.

Ответ 1

Это довольно легко и понятно:

for index, item in enumerate(l):
    others = l[:index] + l[index+1:]

Вы можете сделать итератор из этого, если вы настаиваете:

def iter_with_others(l):
    for index, item in enumerate(l):
        yield item, l[:index] + l[index+1:]

Предоставление использования:

for item, others in iter_with_others(l):
    print(item, others)

Ответ 2

Отвечая на мой собственный вопрос, можно использовать itertools.combinations, используя тот факт, что результат испускается в лексикографическом порядке:

from itertools import combinations
zip(l, combinations(reversed(l), len(l) - 1))

Однако это довольно неясно; решение для ночного чартера намного легче понять для читателя!

Ответ 3

Что насчет

>>> [(i, [j for j in L if j != i]) for i in L]
[(0, [1, 2, 3]), (1, [0, 2, 3]), (2, [0, 1, 3]), (3, [0, 1, 2])]

Хорошо, что газильон тестов и решение @nightcracker скорее всего эффективнее, но...