使用列表值对字典进行分组

时间:2015-08-01 08:37:05

标签: python dictionary

我有一个字典,其中列表是值。我想根据列表中的某些值过滤数据。例如。 。

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

我想创建另一个字典,它只显示最高价格的项目。 。

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

我应该使用哪些代码将广告资源转换为inventoryFiltered?

最终结果应该是针对每种商品类型的最高价格(例如'Cloth','Toy','Electronic','Food','Shoes')

我只有这些模块可用于我的系统。

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

2 个答案:

答案 0 :(得分:4)

您可以对字典中的项目进行排序:

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构造将仅保留特定类别中最昂贵的项目。

答案 1 :(得分:1)

我会先这样翻译字典:

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

如果你有第二个元素,比如几天,只需在最大键值中使用它。