[英]Python - Return a unique list of objects
我正在尝试获取一个唯一的对象列表,我有一些代码可以从 API 中提取数据,然后将该数据放入一个对象中。 然后我把这些对象放在一个列表中。 但是有些对象是重复的,我想知道如何删除它们?
样本列表数据:
[
Policy: 'SQL',
SecondaryPolicy: 'ORACLE',
Level: 'Primary On Call Engineer',
LevelNo: 1,
StartDate: None,
EndDate: None,
StartTime: None,
EndTime: None,
Name: 'Fred',
Mobile: '123',
Policy: 'Comms',
SecondaryPolicy: '',
Level: 'Primary On Call Engineer',
LevelNo: 1,
StartDate: None,
EndDate: None,
StartTime: None,
EndTime: None,
Name: 'Bob',
Mobile: '456',
Policy: 'Infra',
SecondaryPolicy: '',
Level: 'Primary On Call Engineer',
LevelNo: 1,
StartDate: None,
EndDate: None,
StartTime: None,
EndTime: None,
Name: 'Bill',
Mobile: '789',
Policy: 'Comms',
SecondaryPolicy: '',
Level: 'Primary On Call Engineer',
LevelNo: 1,
StartDate: None,
EndDate: None,
StartTime: None,
EndTime: None,
Name: 'Bob',
Mobile: '456',
]
代码(我删除了一些对象数据并放入示例数据,对于这个测试,我只是试图让 freds 结果返回一次)
objPolicyData = getUserData()
OnCallData = []
for UserItem in objPolicyData['users']:
UserData = User()
#get the user object from DB
UserData.Name = 'Fred'
for OnCall in UserItem['on_call']:
UserPolicy = OnCall['escalation_policy']
UserData.Policy = 'SQL'
UserData.SecondaryPolicy = 'ORACLE'
OnCallData.append(UserData)
尝试:我试过这个
clean_on_call_data = {User.Name for User in OnCallData}
但这只会打印
set(['Fred'])
对象中的其他字段在哪里,我将如何迭代它?
编辑:这是我的班级,cmp 正确吗? 我如何删除重复项?
class User(object):
__attrs = ['Policy','SecondaryPolicy','Name']
def __init__(self, **kwargs):
for attr in self.__attrs:
setattr(self, attr, kwargs.get(attr, None))
def __repr__(self):
return ', '.join(
['%s: %r' % (attr, getattr(self, attr)) for attr in self.__attrs])
def __cmp__(self):
if self.Name != other.Name:
对于 Python 2.x
我认为您需要为存储 API 数据的类实现__cmp__
。
对于 Python 3.x
我认为您需要为存储 API 数据的类实现__eq__
和__hash__
。
无论哪个版本的 Python,您都可以使用比较器 / eq 方法来检查列表中的重复项。 这可以通过使用set(list)
来完成,如果你定义了__eq__
。 一组是唯一对象的列表。
使用字典然后使用pandas.DataFrame
怎么pandas.DataFrame
?
就像是:
d1 = {
'Policy': 'SQL',
'SecondaryPolicy': 'ORACLE',
'Level': 'Primary On Call Engineer',
'LevelNo': 1,
'StartDate': None,
'EndDate': None,
'StartTime': None,
'EndTime': None,
'Name': 'Fred',
'Mobile': '123',
}
d2 = {
'Policy': 'Comms',
'SecondaryPolicy': '',
'Level': 'Primary On Call Engineer',
'LevelNo': 1,
'StartDate': None,
'EndDate': None,
'StartTime': None,
'EndTime': None,
'Name': 'Bob',
'Mobile': '456',
}
d3 = {
'Policy': 'Infra',
'SecondaryPolicy': '',
'Level': 'Primary On Call Engineer',
'LevelNo': 1,
'StartDate': None,
'EndDate': None,
'StartTime': None,
'EndTime': None,
'Name': 'Bill',
'Mobile': '789',
}
d4 = {
'Policy': 'Comms',
'SecondaryPolicy': '',
'Level': 'Primary On Call Engineer',
'LevelNo': 1,
'StartDate': None,
'EndDate': None,
'StartTime': None,
'EndTime': None,
'Name': 'Bob',
'Mobile': '456',
}
data = pd.DataFrame([d1,d2,d3,d4])
data[ data.Name=='Fred' ]
哪些出局:
您可以__hash__
User
类并实现__eq__
和__hash__
方法,然后将它们添加到set
,如下所示:
class UserUnique(User):
def __hash__(self):
return hash(self.Name)
def __eq__(self, o):
return self.Name == o.Name
然后你可以这样做:
OnCallData = set()
for UserItem in objPolicyData['users']:
UserData = UserUnique()
UserData.Name = 'Fred'
for OnCall in UserItem['on_call']:
UserPolicy = OnCall['escalation_policy']
UserData.Policy = 'SQL'
UserData.SecondaryPolicy = 'ORACLE'
OnCallData.add(UserData)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.