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

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

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]

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

3 ответа

Решение

Это довольно просто и понятно:

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)

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

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

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

Как насчет

>>> [(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, вероятно, более эффективно, но...

Другие вопросы по тегам