Python按不同属性筛选对象列表

2024-05-20 05:10:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个具有多个属性的对象列表。我想根据对象的一个属性(国家代码)筛选列表,即

当前列表

elems = [{'region_code': 'EUD', 'country_code': 'ROM', 'country_desc': 'Romania', 'event_number': '6880'}, 
{'region_code': 'EUD', 'country_code': 'ROM', 'country_desc':'Romania', 'event_number': '3200'}, 
{'region_code': 'EUD', 'country_code': 'ROM', 'country_desc': 'Romania', 'event_number': '4000'}, 
{'region_code': 'EUD', 'country_code': 'SVN', 'country_desc': 'Slovenia', 'event_number': '6880'}, 
{'region_code': 'EUD', 'country_code': 'NLD', 'country_desc':'Netherlands', 'event_number': '6880'}, 
{'region_code': 'EUD', 'country_code': 'BEL', 'country_desc':'Belgium', 'event_number': '6880'}]

所需列表

^{pr2}$

我可以通过创建一个字典和一个for循环来实现这一点,但我觉得在python中有一种更简单的方法使用filter()或reduce()函数,我只是不知道怎么做。在

有人可以使用内置的python函数简化下面的代码吗?性能是一个重要因素,因为实际数据将非常可观。

工作代码:

unique = {}
for elem in elems:
  if elem['country_code'] not in unique.keys():
     unique[elem['country_code']] = elem

print(unique.values())

值得注意的是,我也尝试了下面的代码,但它的性能比当前的工作代码差:

unique = []
for elem in elems:
    if not any(u['country_code'] == elem['country_code'] for u in unique):
        unique.append(elem)

Tags: 代码ineventnumber列表forromcode
2条回答

我认为你的方法很好。检查elem['country_code'] not in unique而不是elem['country_code'] not in unique.keys()会稍微好一点。在

然而,这里有另一种方法来理解列表:

visited = set()
res = [e for e in elems
        if e['country_code'] not in visited
        and not visited.add(e['country_code'])]

最后一位滥用了not None == True和{}返回{}的事实。在

我认为你的第一种方法已经接近最佳了。字典查找很快(就像在set中一样快),并且循环很容易理解,尽管有点长(按Python标准),但是您不应该为了简洁而牺牲可读性。在

但是,您可以使用setdefault删除一行,并且您可能希望使用^{}以便结果列表中的元素按其原始顺序排列。另外,请注意,在python3中,unique.values()不是一个列表,而是dict上的一个视图

unique = collections.OrderedDict()
for elem in elems:
    unique.setdefault(elem["country_code"], elem)

如果您真的想使用reduce,可以使用空dict作为初始值设定项,然后使用d.setdefault(k,v) and d设置值(如果不存在)并返回修改后的dict

^{pr2}$

不过,我会用这个循环。在

相关问题 更多 >