Перечислите (элемент, другие) в списке
Предположим, у меня есть список:
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 скорее всего эффективнее, но...