[英]Sort python list into dictionary of lists, based on property in list
I'm trying to sort a list of objects in python into a dictionary of lists via a property of the objects in the original list 我正在尝试通过原始列表中对象的属性将python中的对象列表排序为列表字典
I've done it below, but this feels like something I should be able to do using a dictionary comprehension? 我已经在下面完成了,但这听起来像我应该能够使用字典理解来完成?
for position in totals["positions"]:
if not hasattr(totals["positions_dict"], position.get_asset_type_display()):
totals["positions_dict"][position.get_asset_type_display()] = []
totals["positions_dict"][position.get_asset_type_display()].append(position)
Some self improvements 一些自我改进
totals["positions_dict"] = {}
for position in totals["positions"]:
key = position.get_asset_type_display()
if key not in totals["positions_dict"]:
totals["positions_dict"][key] = []
totals["positions_dict"][key].append(position)
You could use itertools.groupby
and operator.methodcaller
in a dict comprehension: 您可以在dict理解中使用
itertools.groupby
和operator.methodcaller
:
from operator import methodcaller
from itertools import groupby
key = methodcaller('get_asset_type_display')
totals["positions_dict"] = {k: list(g) for k, g in groupby(sorted(totals["positions"], key=key), key=key)}
Using a defaultdict
as suggested by @Jean-FrançoisFabre allows you to do it with a single call to get_asset_type_display()
in one loop: 使用@Jean-FrançoisFabre建议的
defaultdict
可以让您在一个循环中通过一次调用get_asset_type_display()
来做到这一点:
from collections import defaultdict
totals["positions_dict"] = defaultdict(list)
for position in totals["positions"]:
totals["positions_dict"][position.get_asset_type_display()].append(position)
Haven't tested this, because I don't have your data. 尚未测试,因为我没有您的数据。 And I think it's rather ugly, but it just may work:
而且我认为这很丑陋,但可能会起作用:
totals ['positions_dict'] = {
key: [
position
for position in totals ['positions']
if position.get_asset_type_display () == key
]
for key in {
position.get_asset_type_display ()
for position in totals ['positions']
}
}
But I would prefer something very simple, and avoid needless lookups / calls: 但我希望使用一些非常简单的方法,并避免不必要的查找/调用:
positions = totals ['positions']
positions_dict = {}
for position in positions:
key = position.get_asset_type_display ()
if key in positions_dict:
positions_dict [key] .append (position)
else:
positions_dict [key] = [position]
totals ['positions_dict'] = positions_dict
positions = totals ['positions']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.