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 - Fatal编程技术网

python中的值赋值

python中的值赋值,python,python-3.x,Python,Python 3.x,我有两个值:starid1、starid2和一个名为starlist的列表,我想从包含id starid1和starid2的starlist中提取两个对象,并且列表中没有重复的id 这就是我编写代码的方式 star1,star2=None,None for x in starlist: if x.id == starid1: star1 = x elif x.id == starid2: star2 = x 还有一种方法 star1 = [x f

我有两个值:starid1、starid2和一个名为starlist的列表,我想从包含id starid1和starid2的starlist中提取两个对象,并且列表中没有重复的id

这就是我编写代码的方式

star1,star2=None,None
for x in starlist:
    if x.id == starid1:
        star1 = x
    elif x.id == starid2:
        star2 = x
还有一种方法

star1 = [x for x in starlist if x.id==starid1][0]
star2 = [x for x in starlist if x.id==starid2][0]
或者我可以把它转换成字典,然后选择这两个对象。但是我觉得成本太高了,因为我只想分配两个值


当我写下这些代码时,我觉得自己太笨了。我想我只是错过了用python编写代码的正确方法。告诉我你知道如何做得更好。

常用的方法是使用发电机:

star1 = next(x for x in starlist if x.id==starid1)
star2 = next(x for x in starlist if x.id==starid2)
这样做的好处是懒惰,因此可以节省内存并提前停止。在您的示例中,这与添加了
break
语句的第一个循环基本相同:

star1,star2=None,None

for x in starlist:
    if x.id == starid1:
       star1 = x
       break

for x in starlist:
    if x.id == starid2:
       star2 = x
       break
但是请注意,如果列表中没有此类项目,
next
将引发异常。如果要避免这种情况,请在调用中添加默认值:

star1 = next((x for x in starlist if x.id==starid1), None)

常用的方法是使用发电机:

star1 = next(x for x in starlist if x.id==starid1)
star2 = next(x for x in starlist if x.id==starid2)
这样做的好处是懒惰,因此可以节省内存并提前停止。在您的示例中,这与添加了
break
语句的第一个循环基本相同:

star1,star2=None,None

for x in starlist:
    if x.id == starid1:
       star1 = x
       break

for x in starlist:
    if x.id == starid2:
       star2 = x
       break
但是请注意,如果列表中没有此类项目,
next
将引发异常。如果要避免这种情况,请在调用中添加默认值:

star1 = next((x for x in starlist if x.id==starid1), None)

您能提供一些示例数据和输出示例吗?您能提供一些示例数据和输出示例吗?找到第一个星后,您的循环将中断,如果star1和star2:break对不起,更好的检查方法是
,使用这样的生成器不是一种常见的方法。找到第一颗星后,您的循环将中断,更好的检查方法是
如果star1和star2:break
对不起,使用这样的生成器不是一种常见的方法。