我有以下python字典:
dictionaryofproduct={
"name":["Magnetic Adsorption Aluminum Bumper Case For Samsung Note 8","ESET Nod32 Antivirus"],
"price":[1200,212]
}
我想按上升序的价格列表对字典进行排序命令如下:
dictionaryofproduct={
"name":["ESET Nod32 Antivirus","Magnetic Adsorption Aluminum Bumper Case For Samsung Note 8"],
"price":[212,1200]
}
如何使用python实现此功能?
提前感谢
在排序操作期间需要将价格和名称保持在一起。这可以通过将它们组合成一个元组列表(从价格开始)来实现,然后将其排序,然后将其分配回字典项:
dictionaryofproduct={
"name":["Magnetic Adsorption Aluminum Bumper Case For Samsung Note 8","ESET Nod32 Antivirus","Other"],
"price":[1200,212,500]
}
prices,names = zip(*sorted(zip(dictionaryofproduct["price"],dictionaryofproduct["name"])))
dictionaryofproduct["price"] = list(prices)
dictionaryofproduct["name"] = list(names)
print(dictionaryofproduct)
{'name': ['ESET Nod32 Antivirus', 'Other', 'Magnetic Adsorption Aluminum Bumper Case For Samsung Note 8'],
'price': [212, 500, 1200]}
注意:我添加了"其他">
另一种方法是编写两个辅助函数来获取和应用相同大小的多个列表的排序:
def getSortOrder(L,key=lambda v:v):
return sorted(range(len(L)),key=lambda i:key(L[i]))
def applySortOrder(L,order): L[:] = [L[i] for i in order]
orderByPrice = getSortOrder(dictionaryofproduct["price"])
applySortOrder(dictionaryofproduct["price"], orderByPrice)
applySortOrder(dictionaryofproduct["name"], orderByPrice)
顺便说一句,如果您不致力于此数据结构,您应该考虑将其更改为元组列表或字典列表,这些列表将每个产品的名称和价格保存在一起,而不是依赖于名称和价格在相同的索引中。如果您想使用这种模型,也可以查看pandas/dataframes。
下面是一个使用价格作为列表查找排序的版本。
initial_price = dictionaryofproduct['price'] # backup
dictionaryofsortedproduct = {key: [v for _, v in sorted(zip(initial_price, value))] for key, value in dictionaryofproduct.items()}
这个想法是在键/值上迭代,并将值与初始价格表压缩。
您可以使用这个示例来实现:
dictionaryofproduct={
"name":["Magnetic Adsorption Aluminum Bumper Case For Samsung Note 8","ESET Nod32 Antivirus"],
"price":[1200,212]
}
pair = zip(dictionaryofproduct.get("name"), dictionaryofproduct.get("price"))
dictionaryofproduct["name"] = [item[0] for item in sorted(pair, key=lambda x: x[1])]
dictionaryofproduct["price"].sort()
print(dictionaryofproduct)
- 通过压缩它们来聚合/打包两个键的值,以便单个名称对应单个价格。
- 使用排序()函数根据价格(即第二个参数(x[1])对压缩值进行排序,并获取排序后的名称。
- 最终排序原来的价格。
您似乎有一个产品名称和价格列表,它们是应该根据列表中的位置匹配。这个设计很有特色很容易出错,也很难找到产品的价格。
我首先建议为您的数据提供不同的设计,使用列表(而不是列表)字典)的产品,以及每个具有属性的产品的字典您感兴趣的(名称,价格):
listofproduct = [
{
"name": "Magnetic Adsorption Aluminum Bumper Case For Samsung Note 8",
"price": 1200,
},
{
"name": "ESET Nod32 Antivirus",
"price": 212,
},
{
"name": "Other",
"price": 500,
},
]
现在很容易对上升的价格进行排序:
sortedlist = sorted(listofproduct, key=lambda x: x['price'])
key
参数是一个函数,它将应用于列表(由x
变量表示)返回用于排序的值关键字,在本例中是产品的价格。