簡體   English   中英

根據列表中的屬性將python列表排序為列表字典

[英]Sort python list into dictionary of lists, based on property in list

我正在嘗試通過原始列表中對象的屬性將python中的對象列表排序為列表字典

我已經在下面完成了,但這聽起來像我應該能夠使用字典理解來完成?

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)

一些自我改進

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)

您可以在dict理解中使用itertools.groupbyoperator.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)}

使用@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)

尚未測試,因為我沒有您的數據。 而且我認為這很丑陋,但可能會起作用:

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']
    }
}

但我希望使用一些非常簡單的方法,並避免不必要的查找/調用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM