Итерация по списку без двойного - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь перебрать список, подобный приведенному ниже, но я немного новичок в python и хотел бы знать, есть ли шанс преодолеть два цикла for.Есть ли способ сделать это?Заранее спасибо

temp = [0, 2, 3, 4]
for index, pointer in enumerate(temp):
    for i in range(len(temp)):
        if i != index:
           print(temp[i])

Результаты:

2
3
4
0
3
4
0
2
4
0
2
3

Ответы [ 5 ]

3 голосов
/ 05 апреля 2019
temp = [0, 2, 3, 4]
sol=[]
for i in range(len(temp)):
    sol.extend(temp[:i]+temp[i+1:])
print(sol)

выход

 [2, 3, 4, 0, 3, 4, 0, 2, 4, 0, 2, 3]
0 голосов
/ 05 апреля 2019

Предлагаю следующее решение.Используемое решение список понимания .

temp = [0,2,3,4]    
(sum([ temp[0:x]+temp[x+1::]  for x in range(len(temp))],[]))

enter image description here

0 голосов
/ 05 апреля 2019

Один из способов сделать то, что вы пытаетесь сделать, это использовать itertools.product, что примерно соответствует вложенным циклам for.

Просто передайте объекты, которые повторяются, в качестве аргументов, например, ваш код становится:

import itertools

temp = [0, 2, 3, 4]

for (index, pointer), i in itertools.product(enumerate(temp), range(len(temp))):
    if i != index:
        print(temp[i])

Или, поскольку вам не нужно pointer:

import itertools

temp = [0, 2, 3, 4]

for i, j in itertools.product(range(len(temp)), range(len(temp))):
    if i != j:
        print(temp[j])

Функция itertools.product названа в честь декартова произведения .

0 голосов
/ 05 апреля 2019

Использование product из itertools:

[u for i, (j, u) in product(range(len(temp)), enumerate(temp)) if j != i]

Это зависит от вашего списка (все значения должны быть уникальными), но это также работает для данного ввода

[v for u, v in product(temp, temp) if u != v]

Оба дают

[2, 3, 4, 0, 3, 4, 0, 2, 4, 0, 2, 3]

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

0 голосов
/ 05 апреля 2019

Я считаю, что это решает вашу проблему.Я представлял эту проблему как печать элементов вектора, сшитых между собой, без печати элементов по диагонали получившейся матрицы.

values = [0, 2, 3, 4]

for index in range(len(values)**2):
    if index % (len(values)+1) != 0:
        print(values[index % (len(values))])

Вывод:

2
3
4
0
3
4
0
2
4
0
2
3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...