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