Python 3.x 使用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循环对嵌套字典进行重新排序,使其仅具有最低的价格,但这样做会将它们

我在上下文中所做工作的背景:

我使用一个刮削工具返回不同网站上的物品价格,以进行比较。该信息最初存储为表单的嵌套字典

{'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个条目的最小可执行文件,但我的实际代码从互联网上提取了数百个条目。我不可能手动分配它们。这就是为什么我想帮助构建一个循环,你也这么做了。很高兴你发现代码很有用。如果它解决了你的问题,请接受它。至于这个链接,我想它可以解释我在你的代码中所做的主要更改。我不是指示您手动分配值,而是试图指出分配解包是如何工作的,因为您尝试迭代
子贪婪