我不需要遍历对象中的所有属性。相反,我需要迭代对象列表,但具有特定属性。 我有一个名为 PlayerList 的运动员对象列表,我想迭代每个对象的唯一 ID。有什么方法可以做到这一点,我知道有某种方法可以用字典做类似的事情,您可以在其中迭代关联的值。
for ID (in athletelist).ID:
目前我希望它是一个表达式,因为我只想检查重复项并需要一个真值
if ID (in athletelist).ID:
有两种方法可以解决这个问题,要么通过断言列表没有重复项,您可以使用 sets 来完成,或者如您所提到的,使用检查。请注意,我描述的两种方法都可以在迭代列表之前使用。
方法一:设置断言
python 中的集合可确保不存在重复数据,这是通过检查每个对象属性内的数据来完成的。另一方面,如果 2 个运动员对象共享相同的 ID,但另一个属性(例如姓名)具有不同的值,则这可能不足以满足您的情况。您最了解您的用例,因此可以确定这是否适合您;实现这一点的方法相当简单:
athletelist = list(set(athletelist))
方法2:设置理解和计数检查
稍微复杂一些,但仅取决于 ID。
细分步骤为:
创建在运动员列表中找到的唯一 ID(即一组 ID)列表
将运动员的长度与一组的长度进行比较
ID
您的最终检查将如下所示:
if len(atheletelist) == len({athelete.ID for athelete in atheletelist}):
print("IDs are unique")
else:
print("IDs are not unique")
这可以通过 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)
您在原始帖子中提到您想检查运动员名单中是否有重复项。
这可以通过创建一个列表理解来完成,我们将所有唯一的 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。