Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表理解中的变量赋值_Python_Python 3.x_List - Fatal编程技术网

Python 列表理解中的变量赋值

Python 列表理解中的变量赋值,python,python-3.x,list,Python,Python 3.x,List,是否可以在列表中指定变量? 例如,我想用这个例子写一个列表理解,我能在我的列表理解中设置变量“set_”吗?(我不想使用海象的表达方式) 对。在Python3.8中,可以使用赋值表达式 output = [i for i in people if (set_ := i.split(' '))[3] == 'cat' and set_[0] in names] 在Python3.8之前,您需要第二个for子句和一个单例iterable output = [i for i in people fo

是否可以在列表中指定变量? 例如,我想用这个例子写一个列表理解,我能在我的列表理解中设置变量“set_”吗?(我不想使用海象的表达方式)


对。在Python3.8中,可以使用赋值表达式

output = [i for i in people if (set_ := i.split(' '))[3] == 'cat' and set_[0] in names]
在Python3.8之前,您需要第二个
for
子句和一个单例iterable

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

添加赋值表达式正是为了避免需要第二个
for
子句。

是。在Python3.8中,可以使用赋值表达式

output = [i for i in people if (set_ := i.split(' '))[3] == 'cat' and set_[0] in names]
在Python3.8之前,您需要第二个
for
子句和一个单例iterable

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

添加赋值表达式正是为了避免第二个
for
子句的需要。

您可以通过将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)]

通过将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)]
试试这个:

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]
输出是->
[“约翰有一只猫”,“彼得有一只猫”]
试试这个:

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]
输出是->
[“约翰有一只猫”,“彼得有一只猫”]

怎么了

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

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

对于这个特定的例子,我建议使用解包来让列表更清晰:

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" ]
或压缩和映射以避免重建字符串:

output = [p for p,(name,_,_,pet) in zip(people,map(str.split,people)) if name in names and pet == "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" ]
或压缩和映射以避免重建字符串:

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

[如果i.split()[3]='cat'和i.split()[0]在名称中,则i代表人中的i]
?列表理解是根据逻辑高效创建列表的工具。您是否质疑如何创建列表,以及如何在之后保留一个可用的
set
变量,因为这是不可能的。如果你的问题只是如何将
i.split(“”)
逻辑整合到理解中,那就非常重要了acheivable@G.Anderson鉴于循环完成后只能访问
set\uu
的最后一个值,我认为可以安全地假设后者。@chepner我不反对,但它不够明确,我觉得有必要提出澄清要求。干杯
[如果i.split()[3]='cat'和i.split()[0]在名称中,那么我代表我]
?列表理解是根据逻辑高效创建列表的工具。您是否质疑如何创建列表,以及如何在之后保留一个可用的
set
变量,因为这是不可能的。如果你的问题只是如何将
i.split(“”)
逻辑整合到理解中,那就非常重要了acheivable@G.Anderson鉴于循环完成后只能访问
set\uu
的最后一个值,我认为可以安全地假设后者。@chepner我不反对,但它不够明确,我觉得有必要提出澄清要求。欢呼对
i.split()
的不必要的第二次调用是大多数人都会反对的。对
i.split()
的不必要的第二次调用是大多数人都会反对的。你能解释一下为什么Supersew的解决方案不是前进的最佳方式吗?因为你不必要地调用了
i.split
两次。除了运行时开销外,还有一个维护问题:如果字符串的格式发生变化,将有两次调用
i.split()
进行调整,而不是只调用一次。您能否解释一下为什么Supersew的解决方案不是前进的最佳方式?因为您不必要地调用了
i.split
两次。除了运行时开销之外,还有一个维护问题:如果字符串的格式发生更改,则会有两个调用
i.split()
进行调整,而不是只调用一个。