簡體   English   中英

用列表值對字典進行分組

[英]grouping dictionary with list values

我有一本字典,其中的列表是值。 我想根據列表中的某些值過濾數據。 例如。

inventory = {'A':['Toy',3], 'B':['Toy',8], 'C':['Cloth',15], 'D':['Cloth',9], 'E':['Toy',11]}

我想創建另一本詞典,在該詞典中僅顯示價格最高的商品。

inventoryFiltered = {'C':['Cloth',15], 'E':['Toy',11]}

我應該使用什么代碼將庫存轉換為庫存過濾?

最終結果應針對每種商品類型(例如“服裝”,“玩具”,“電子產品”,“食品”,“鞋子”)標出最高價

我的系統只有這些模塊可用。

bisect
cmath
collections
datetime
functools
heapq
itertools
math
numpy
pandas
pytz
Queue
random
re
scipy
statsmodels
sklearn
talib
time
zipline

此外,我想再完成一個步驟。 假設我還有一個數據元素(我要添加商品的庫存天數(在商店或倉庫中的天數)。

inventory = {'A':['Toy',3, 30], 'B':['Toy',8, 40], 
    'C':['Cloth',15, 50], 'D':['Cloth',9, 60], 'E':['Toy',11, 70]}.  

我希望它做完全相同的事情。 但是保留最后一個元素(庫存天數)

inventoryFiltered = {'C':['Cloth',15, 50], 'E':['Toy',11, 70]}

您可以對字典中的項目進行排序:

inventory = {
    'A': ['Toy', 3, 30],
    'B': ['Toy', 8, 80],
    'C': ['Cloth', 15, 150],
    'D': ['Cloth', 9, 90],
    'E': ['Toy', 11, 110]
}

items = sorted(inventory.items(), key=lambda item: item[1][1])

most_expensive_by_category = {item[0]: (key, item) for key, item in items}

most_expensive = dict(most_expensive_by_category.values())

結果:

{'C': ['Cloth', 15, 150], 'E': ['Toy', 11, 110]}

使用items = sorted(inventory.items(), key=lambda item: item[1][1])我們按價格對輸入字典中的項目進行排序。 由於排序順序, most_expensive_by_category構造將僅保留特定類別中最昂貴的商品。

我首先會像這樣反轉字典:

inv={}
for k, li in inventory.items():
    inv.setdefault(li[0], []).append([k, li[1]])

>>> inv
{'Cloth': [['C', 15], ['D', 9]], 'Toy': [['A', 3], ['B', 8], ['E', 11]]}

然后獲取任何類別的最大值都是微不足道的:

>>> max(inv['Cloth'], key=lambda l: l[1])
['C', 15]
>>> max(inv['Toy'], key=lambda l: l[1])
['E', 11]
>>> {k:max(inv[k], key=lambda l: l[1]) for k,v in inv.items()}
{'Cloth': ['C', 15], 'Toy': ['E', 11]}

如果您還有第二個元素,例如年齡,只需在最大鍵值中使用它即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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