按属性迭代对象列表

问题描述 投票:0回答:3

我不需要遍历对象中的所有属性。相反,我需要迭代对象列表,但具有特定属性。 我有一个名为 PlayerList 的运动员对象列表,我想迭代每个对象的唯一 ID。有什么方法可以做到这一点,我知道有某种方法可以用字典做类似的事情,您可以在其中迭代关联的值。

for ID (in athletelist).ID:

目前我希望它是一个表达式,因为我只想检查重复项并需要一个真值

if ID (in athletelist).ID:
python object iteration
3个回答
0
投票

有两种方法可以解决这个问题,要么通过断言列表没有重复项,您可以使用 sets 来完成,或者如您所提到的,使用检查。请注意,我描述的两种方法都可以在迭代列表之前使用。
方法一:设置断言
python 中的集合可确保不存在重复数据,这是通过检查每个对象属性内的数据来完成的。另一方面,如果 2 个运动员对象共享相同的 ID,但另一个属性(例如姓名)具有不同的值,则这可能不足以满足您的情况。您最了解您的用例,因此可以确定这是否适合您;实现这一点的方法相当简单:

athletelist = list(set(athletelist))  

方法2:设置理解和计数检查
稍微复杂一些,但仅取决于 ID。
细分步骤为:

  1. 创建在运动员列表中找到的唯一 ID(即一组 ID)列表

  2. 将运动员的长度与一组的长度进行比较 ID
    您的最终检查将如下所示:

    if len(atheletelist) == len({athelete.ID for athelete in atheletelist}):  
        print("IDs are unique")  
    else:  
        print("IDs are not unique")  

0
投票

这可以通过 python 中的简单 for 循环来完成。

for athelete in atheleteList:
    print(athelete.id)

我们可以使用 getattr 来检查对象的值是否存在。

class Athelete:
    id=""
    
    def __init__(self,id):
        self.id=id
    
    def get_id(self):
        return self.id
    
atheleteList = [Athelete(id=i) for i in range(3)]

atheleteList.append(Athelete(id=""))
atheleteList.append(Athelete(id=""))
print(atheleteList)

aab= [athelete.id for athelete in atheleteList
if (getattr(athelete,'get_id')() != "")
]
print(aab)

-1
投票

您在原始帖子中提到您想检查运动员名单中是否有重复项。

这可以通过创建一个列表理解来完成,我们将所有唯一的 ID 放入一个变量中,然后将长度与运动员总数进行比较。首先,我们收集唯一 id 的总数,如下所示:

unique_ids = {athlete.ID for athlete in athleteList}

接下来,我们可以通过创建一个名为 has_duplicates

的布尔值来将唯一 ID 的总长度与运动员列表的总长度进行比较
has_duplicates = len(unique_ids) != len(athleteList)

如果存在重复的 ID,则唯一 ID 列表的长度将比运动员列表短,因此将返回 true。如果所有 id 都是唯一的,那么长度将相同,并且 has_duplicates 将返回 false。

© www.soinside.com 2019 - 2024. All rights reserved.