Python 使用列表值对字典进行分组
我有一本字典,其中列表是值。我想根据列表中的某些值筛选数据。例如Python 使用列表值对字典进行分组,python,dictionary,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]} 我应该使用什么代码将库存转换为库存过滤 最终结果应为每种商品类型(如“布料”、“
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, 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_-price_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]}
如果您有第二个元素,如days of age,只需在最大键值中使用它。Super。您介意向我解释一下:[1][1]和[:2]在做什么吗?我需要将此逻辑应用于更复杂的数据集。非常感谢您的解释。但是,您可以[:2]修改?因为我的真实数据集可以有“玩具”、“布料”、“音乐”、“电子产品”……这意味着它是可变的,而且很多。所以[:2]对我不起作用。如果我有“玩具”、“布料”、“音乐”,那么我需要[:3]。我永远不知道会显示多少独特的物品。你是说你想要每个类别的最高价格吗?如果是,那么我回答了错误的问题:)你能在问题中澄清一下吗?JuniorCompressor,你是对的。谢谢,我更新了问题。JuniorCompressor,我刚刚更新了我的原始问题。改变是否会使解决方案变得更困难?谢谢。但是你能不能这样做,这样我就不仅能拿到最高分,还能拿到前两名或前三名?如果我只有一个数据元素,我想删除它。只需排序和切片,而不是使用
max
函数。
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]}