Python 词典

Python dictionary

我在理解这个问题时遇到了一些困难,我已经尝试将问题减少到这组代码

for k in y.keys():
    if k in dateDict.keys():

        if yearDict[k] in dict1:
            dict1[yearDict[k]].extend(y[k])
        else:
            dict1[yearDict[k]] = y[k]

        if yearDict[k] in dict2:
            dict2[yearDict[k]].extend(y[k])
        else:
            dict2[yearDict[k]] = y[k]
    else:
        continue

我有两本词典 ydateDict。对于 dateDicty 的匹配键,我正在填充另外两个字典 dict1dict2,并使用其他字典 yearDict 中的键进行哈希处理。不幸的是,结果在 dict1dict2 中重复,我有重复的值。知道会发生什么吗?

我还注意到此代码按预期工作,

for k in y.keys():
    if k in dateDict.keys():

        if yearDict[k] in dict1:
            dict1[yearDict[k]].extend(y[k])
        else:
            dict1[yearDict[k]] = y[k]
    else:
        continue

如果y[k]是一个列表(它看起来像),同一个列表将被分配到任何使用它的地方。字典在分配元素时不会复制元素,它们只是保留对其对象的引用。在您的示例中, dict1dict2 中的两个键都将指向 same 对象。

稍后修改时,same 元素将附加新值,每个地图一次。为防止这种情况,您可以在初始分配时创建一个新列表:

dictl[yearDict[k]] = list(y[k])

不过,了解 Python 标准库总是好的。通过使用 collections.defaultdict:

可以使这段代码更具可读性,并且没有错误
from collections import defaultdict

# This goes wherever the dictionaries 
# where initially defined.
dict1 = defaultdict(list)
dict2 = defaultdict(list)

# You can get the value here, no need to search it later.
for k, value in y.items():
    if k in dateDict.keys():
        # No need to call this everywhere.
        new_key = yearDict[k]

        # Note the defaultdict magic.
        dict1[new_key].extend(value)
        dict2[new_key].extend(value)

    # No need for the 'continue' at the end either.

当要求提供一个尚不存在的密钥时,defaultdict 会即时创建一个新密钥——因此您不必关心初始化或创建您的值的副本。