繁体   English   中英

如何更新python中的嵌套字典键

[英]how to update nested dictionary key in python

我有一本主字典和空白字典,

Dairy_goods = {1:{'item':'Milk','price':2.47,'gst':0.16,'offer':'Yes'},
    2:{'item':'Butter','price':4.50,'gst':0.32,'offer':'No',},
    3:{'item':'Egg','price':3.40,'gst':0.24,'offer':'No'}}

我已经对它进行了编码,以便按字母顺序排序。

While True:
    res = sorted(Dairy_goods.items(), key = lambda x: x[1]['item']) #by name
    print("The sorted dictionary by marks is : " + str(res))

输出将是

    The sorted dictionary by marks is : [(2, {'item': 'Butter', 'price': 4.5, 'gst': 0.32, 'offer': 'No'}), 
(3, {'item': 'Egg', 'price': 3.4, 'gst': 0.24, 'offer': 'No'}), 
(1, {'item': 'Milk', 'price': 2.47, 'gst': 0.16, 'offer': 'Yes'})]

正如您所看到的,主键值在排序后被弄乱了,想知道是否有办法更改/更新键名,以便按顺序列出。

#desired output
    The sorted dictionary by marks is : [(1, {'item': 'Butter', 'price': 4.5, 'gst': 0.32, 'offer': 'No'}), 
(2, {'item': 'Egg', 'price': 3.4, 'gst': 0.24, 'offer': 'No'}), 
(3, {'item': 'Milk', 'price': 2.47, 'gst': 0.16, 'offer': 'Yes'})]

谢谢你。

*编辑:我意识到这篇文章的标题可能不符合我的要求,如果你知道,请告诉我我应该如何命名这个问题,谢谢

*编辑:正如 AKS 所提到的,使用 enumerate 效果很好! 但由于我仍然希望将数字的值附加到列表中,例如当我选择选项“1”时,它仍然会给我“牛奶”的键值,因为它是主字典中的第一个键有什么解决办法吗?

#output now
[(1, {'item': 'Butter', 'price': 4.5, 'gst': 0.32, 'offer': 'No'}),
 (2, {'item': 'Egg', 'price': 3.4, 'gst': 0.24, 'offer': 'No'}),
 (3, {'item': 'Milk', 'price': 2.47, 'gst': 0.16, 'offer': 'Yes'})]

select your input: 1 #user input
how many do you want?: 1 #user input

Milk , {'Quantity': 1, 'Individual price': 2.47, 'total': 2.47, 'GST': 0.16, 'offer': 'Yes'} #output
>>> list(enumerate(sorted(Dairy_goods.values(), key=lambda x: x['item']), start=1)) 
[(1, {'item': 'Butter', 'price': 4.5, 'gst': 0.32, 'offer': 'No'}),
 (2, {'item': 'Egg', 'price': 3.4, 'gst': 0.24, 'offer': 'No'}),
 (3, {'item': 'Milk', 'price': 2.47, 'gst': 0.16, 'offer': 'Yes'})]

只需对值进行排序并使用enumerate

如果您不需要列表而是 dict,只需将list替换为dict


我仍然希望将数字的值附加到列表中,例如,当我选择选项“1”时,它仍然会给我“牛奶”的键值,因为它是主字典中的第一个键,有没有解决这个问题?

帖子中没有代码显示如何访问这些值。 但是因为您正在获取Milk ,我猜您仍在使用Dairy_goods来访问该值。 正如我在下面的评论中提到的,您可以做两件事:

  • 或者,将值分配给Dairy_goods ,这样您就可以保留其余代码,因为您可以使用Dairy_goods[1]等访问第一个元素。
Dairy_goods = dict(enumerate(sorted(Dairy_goods.values(), key=lambda x: x['item']), start=1))
  • 或者,将此排序的 dict 分配给一个新值并使用new_dairy_goods访问该值。
new_dairy_goods = dict(enumerate(sorted(Dairy_goods.values(), key=lambda x: x['item']), start=1))

基本上,您有一个要按某些值排序的元组列表。 由于元组是您要排序的“单位”,因此您无法在对元组进行排序时分解每个元组的值。

无论如何,您可以通过以下方式实现预期输出:

  1. 像你一样按x[1]['item']对元组进行排序
  2. 按照列表中的顺序对结果重新编号(例如,通过使用enumerate ,正如 AKS 在其他答案中建议的那样

你可以这样做。

  • 'item'对字典的值进行排序
  • 使用enumerate将序列值分配给已排序的值
  • 将该enumerate对象转换为列表以获得所需的输出
d = {1:{'item':'Milk','price':2.47,'gst':0.16,'offer':'Yes'},
    2:{'item':'Butter','price':4.50,'gst':0.32,'offer':'No',},
    3:{'item':'Egg','price':3.40,'gst':0.24,'offer':'No'}}
    
x = list(enumerate(sorted(d.values(), key= lambda x: x['item']), start=1))
print(x)
[(1, {'item': 'Butter', 'price': 4.5, 'gst': 0.32, 'offer': 'No'}), (2, {'item': 'Egg', 'price': 3.4, 'gst': 0.24, 'offer': 'No'}), (3, {'item': 'Milk', 'price': 2.47, 'gst': 0.16, 'offer': 'Yes'})]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM