Как посмотреть на l oop в пределах для l oop пути питона c - PullRequest
1 голос
/ 02 марта 2020

Я нашел этот код в itertools.product, чтобы найти уникальные комбинации списков

args = [["a","b"], ["a", "c", "d"], ["h"]]
pools = [tuple(pool) for pool in args]

for pool in pools:
    result = [x + [y] for x in result for y in pool]

, что дает:

print(result)
[['a', 'a', 'h'], ['a', 'c', 'h'], ['a', 'd', 'h'], ['b', 'a', 'h'], ['b', 'c', 'h'], ['b', 'd', 'h']]

Теперь мне интересно, есть ли способ написать это «нормальным» способом с циклами for? Мне удалось переписать его для сингла для l oop с оператором if, как показано ниже:

[s for s in p if s != 'a']

равно:

s = []
for x in p:
    if x != 1:
        s.append(x)

Но мне не удалось сделать это для a для l oop в пределах для l oop ... Я довольно новичок в этом, поэтому я предполагаю, что должен быть какой-то способ сделать это, но я не понимаю, как. Кто-нибудь как это сделать?

1 Ответ

0 голосов
/ 02 марта 2020

Я думаю, что вы можете продолжить тренд, например:

[(x,y) for x in [0,1,2,3,4,5] if x < 3 for y in [0,1,2,3,4,5] if 2 < y if x + y == 4]

эквивалентно (взяв каждые for и if и поместив их в новую строку):

s = []
for x in [0,1,2,3,4,5]:
    if x < 3:
        for y in [0,1,2,3,4,5]:
            if 2 < y:
                if x + y == 4:
                    s.append((x,y))

Для примера в вопросе, result внутри понимания списка относится к старому значению result, поэтому необходимо сохранить это значение при создании нового result:

result = [[]]
for pool in pools:
    old_result = result # remember the old result
    result = [] # build the new result with this variable
    for x in old_result:
        for y in pool:
            result.append(x + [y])

В качестве альтернативы, вы можете создать новый result в другой переменной и установить для него result:

result = [[]]
for pool in pools:
    new_result = [] # build the new result with this variable
    for x in result:
        for y in pool:
            new_result.append(x + [y])
    result = new_result # update our current result

Есть также другой пример здесь .

...