0

我有两个值: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 中执行此操作的正确方法。告诉我你怎么知道做得更好。

4

1 回答 1

3

一种常见的方法是使用生成器:

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)
于 2013-01-23T11:55:08.940 回答