Назначение переменной в понимании списка - PullRequest
1 голос
/ 24 февраля 2020

Можно ли назначить переменную в пределах понимания списка? Например, я хочу написать понимание списка в этом примере, могу ли я установить свою переменную "set_" в моем понимании списка? (Я не хочу использовать выражение моржа)

people = ['John has a cat','Sarah has a dog','David has a cat','Peter has a cat']
names = ['John','Peter']

output = []
for i in people:
    set_ = i.split(' ')
    if set_[3] == 'cat' and set_[0] in names:
        output.append(i)

Ответы [ 5 ]

4 голосов
/ 24 февраля 2020

Да. В Python 3.8 вы можете использовать выражение присваивания.

output = [i for i in people if (set_ := i.split(' '))[3] == 'cat' and set_[0] in names]

До Python 3.8 вам понадобится второе предложение for с итерацией-одиночкой.

output = [i for i in people for set_ in [i.split()] if set_[3] == 'cat' and set_[0] in names]

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

1 голос
/ 24 февраля 2020

Попробуйте это:

people = ['John has a cat','Sarah has a dog','David has a cat','Peter has a cat']
names = ['John','Peter']


output = [i for i in people if i.split()[3]=='cat' and i.split()[0] in names]

Вывод -> ['John has a cat', 'Peter has a cat']

1 голос
/ 24 февраля 2020

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

def check(i):
    set_ = i.split(' ')
    return set_[3] == 'cat' and set_[0] in names

output = [i for i in people if check(i)]
0 голосов
/ 25 февраля 2020

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

output = [p for p in people for name,_,_,pet in [p.split()] if name in names and pet == "cat" ]

Вы также можете использовать map, чтобы разбить строки в сингле для l oop:

output = [" ".join(p) for p in map(str.split,people) if p[0] in names and p[3] == "cat" ]

или почтовый индекс и карта, чтобы избежать восстановления строк:

output = [p for p,(name,_,_,pet) in zip(people,map(str.split,people)) if name in names and pet == "cat"]
0 голосов
/ 24 февраля 2020

Что не так с

output=[i for i in people if i.split(' ')[3]=='cat' and i.split(' ')[0] in names]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...