我有一个具有多个属性的对象列表。我想根据对象的一个属性(国家代码)筛选列表,即
当前列表
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)
我认为你的方法很好。检查
elem['country_code'] not in unique
而不是elem['country_code'] not in unique.keys()
会稍微好一点。在然而,这里有另一种方法来理解列表:
最后一位滥用了}返回{}的事实。在
not None == True
和{我认为你的第一种方法已经接近最佳了。字典查找很快(就像在
set
中一样快),并且循环很容易理解,尽管有点长(按Python标准),但是您不应该为了简洁而牺牲可读性。在但是,您可以使用} 以便结果列表中的元素按其原始顺序排列。另外,请注意,在python3中,
setdefault
删除一行,并且您可能希望使用^{unique.values()
不是一个列表,而是dict上的一个视图如果您真的想使用
^{pr2}$reduce
,可以使用空dict作为初始值设定项,然后使用d.setdefault(k,v) and d
设置值(如果不存在)并返回修改后的dict不过,我会用这个循环。在
相关问题 更多 >
编程相关推荐