簡體   English   中英

在列表理解中分配變量

[英]Assigning variable in list comprehension

是否可以在列表理解中分配變量? 例如,我想用這個例子寫一個列表理解,我可以在我的列表理解中設置我的變量“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)

是的。 在 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子句。

您可以通過將 if-check 拉到理解之外來獲得相同的結果:

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

output = [i for i in people if check(i)]

嘗試這個 :

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']

對於那個特定的例子,我建議使用解包來使列表理解更清晰:

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

您還可以使用 map 在單個 for 循環中斷開字符串:

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

或 zip 和 map 以避免重建字符串:

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

怎么了

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM