2012-08-31 3 views
10

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

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] 

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

ответ

13

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

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) 
+0

Это хорошо работает, и именно то, что ecatmur просили, но, кажется, упражнение в создании бесплатного списка. Он мог бы работать с большими списками. Интересно, может ли быть лучше создать какой-то объект-обертку, который предоставляет представление в исходном списке. –

+0

@StevenRumbalski: да, но я оставлю это как упражнение для читателя, если не будет огромного спроса. – orlp

3

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

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

Однако, это довольно неясное; Решение nightcracker - это лот легче понять для читателя!

2

насчет

>>> [(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])] 

ОК, это Gazillion испытаний и решения @ nightcracker является, вероятно, более эффективным, но да ...

+0

Вы можете использовать выражения генератора вместо понимания списков и тем самым избегать создания ненужных списков, о которых мечтал @StevenRumbalski. –

+0

Да, я мог бы использовать генератор для всего выражения, но не для внутреннего цикла: OP хотел распечатать списки, а не генераторы. –

+0

Правильно, по крайней мере, в его примере. Вопрос в том, действительно ли это то, что он хочет делать с результатами. Но он может решить это для себя. –

Смежные вопросы