Python 3.x 使用for循环从字典中嵌套的列表中提取值
我在上下文中所做工作的背景: 我使用一个刮削工具返回不同网站上的物品价格,以进行比较。该信息最初存储为表单的嵌套字典 {'55“4K HDR':{'BEST BUY':279.99,“KOHL'S':279.99,'TARGET':279.99} '55“4K超高清LED':{'BEST BUY':329.99,'COSTCO':349.99,'TARGET':329.99,'WALMART':328.0}…} 等等。我使用for循环对嵌套字典进行重新排序,使其仅具有最低的价格,但这样做会将它们转换为列表Python 3.x 使用for循环从字典中嵌套的列表中提取值,python-3.x,Python 3.x,我在上下文中所做工作的背景: 我使用一个刮削工具返回不同网站上的物品价格,以进行比较。该信息最初存储为表单的嵌套字典 {'55“4K HDR':{'BEST BUY':279.99,“KOHL'S':279.99,'TARGET':279.99} '55“4K超高清LED':{'BEST BUY':329.99,'COSTCO':349.99,'TARGET':329.99,'WALMART':328.0}…} 等等。我使用for循环对嵌套字典进行重新排序,使其仅具有最低的价格,但这样做会将它们
def sortKey(keyValue):
g = {}
for k, subdic in keyValue.items():
g[k] = {}
for subk, v in sorted(subdic.items(), key=lambda x: x[1], reverse=True):
g[k] = [subk, v]
return g
这导致了以下输出
{'55“4K HDR':['BEST BUY',279.99],
'55“4K超高清LED':['WALMART',328.0]…]
现在,我正在尝试将嵌套列表的格式切换到单个字典中,这样我就可以使用贪婪算法来找到我可以花费一定预算的所有方法。我希望得到像这样的输出
{'55“4K HDR':279.99,'55“4K超高清LED':328.0…}
等等。我正在尝试使用一个类似于我以前使用的for循环
def greedyKey(keyGreed):
f= {}
for g, subGreed in keyGreed.items():
f[g] = ()
for subg, v in subGreed:
f = v
return f
但是我越来越
ValueError:要解压缩的值太多(应为2个)
我知道这与列表的值有关,但我感到困惑,因为我认为每个嵌套列表只有2个值
[沃尔玛,328.0]
最小可执行示例
import pprint
dataDict = {'55" 4K HDR': {'BEST BUY': 279.99, "KOHL'S": 279.99,'TARGET': 279.99},
'55" 4K UHD LED': {'BEST BUY': 329.99,'COSTCO': 349.99,'TARGET': 329.99, 'WALMART': 328.0}}
def sortKey(keyValue):
g = {}
for k, subdic in keyValue.items():
g[k] = {}
for subk, v in sorted(subdic.items(), key=lambda x: x[1], reverse=True):
g[k] = [subk, v]
return g
def greedyKey(keyGreed):
f= {}
for g, subGreed in keyGreed.items():
f[g] = ()
for subg, v in subGreed:
f = v
return f
masterList = sortKey(dataDict)
pprint.pprint(masterList)
greedyList = greedyKey(masterList)
pprint.pprint(greedyList)
请参阅答案,其中说明:
当一个iterable
被分配给多个变量时,Python会使用assignment unpacking
本质上,subg,v=subgrade
相当于subg,v=subgrade[0],subgrade[1]
,这就是我认为您在这里寻找的。
也不需要将f[g]
作为一个元组
def greedyKey(keyGreed):
f = {}
for g, subGreed in keyGreed.items():
subg, v = subGreed
f[g] = v
return f
你能提供一个最小的,可执行的例子吗?显然,您显示的是函数体,但不是签名,也不是如何调用它们。
keyGrade
是第一个代码块的g
?您是否检查/打印了subgrade
的一些值以确认它们是您认为的值?对不起,keygrade
是我函数的参数,我没有在中复制代码。我现在编辑了它<代码>子贪婪给了我我认为正确的输出,但嵌套循环不起作用。如果我注释掉嵌套循环,我会得到{'55“4K HDR':(),'55“4K UHD LED':()…}我还在最后添加了一个最小的可执行示例,以便您可以复制和粘贴以运行itI。我感谢您的帮助和解释!然而,我不明白你的答案是如何回答我的问题的。它说明了什么是任务解包(我在其他地方读过,但没有发现特别有用),但给出的解决方案指示海报简单地写出并手动分配他的值。我不能这样做,因为虽然我给了你一个只有2个条目的最小可执行文件,但我的实际代码从互联网上提取了数百个条目。我不可能手动分配它们。这就是为什么我想帮助构建一个循环,你也这么做了。很高兴你发现代码很有用。如果它解决了你的问题,请接受它。至于这个链接,我想它可以解释我在你的代码中所做的主要更改。我不是指示您手动分配值,而是试图指出分配解包是如何工作的,因为您尝试迭代子贪婪
。