Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用列表值对字典进行分组_Python_Dictionary - Fatal编程技术网

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