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
我有两本词典 y
和 dateDict
。对于 dateDict
中 y
的匹配键,我正在填充另外两个字典 dict1
和 dict2
,并使用其他字典 yearDict
中的键进行哈希处理。不幸的是,结果在 dict1
和 dict2
中重复,我有重复的值。知道会发生什么吗?
我还注意到此代码按预期工作,
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]
是一个列表(它看起来像),同一个列表将被分配到任何使用它的地方。字典在分配元素时不会复制元素,它们只是保留对其对象的引用。在您的示例中, dict1
和 dict2
中的两个键都将指向 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
会即时创建一个新密钥——因此您不必关心初始化或创建您的值的副本。
我在理解这个问题时遇到了一些困难,我已经尝试将问题减少到这组代码
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
我有两本词典 y
和 dateDict
。对于 dateDict
中 y
的匹配键,我正在填充另外两个字典 dict1
和 dict2
,并使用其他字典 yearDict
中的键进行哈希处理。不幸的是,结果在 dict1
和 dict2
中重复,我有重复的值。知道会发生什么吗?
我还注意到此代码按预期工作,
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]
是一个列表(它看起来像),同一个列表将被分配到任何使用它的地方。字典在分配元素时不会复制元素,它们只是保留对其对象的引用。在您的示例中, dict1
和 dict2
中的两个键都将指向 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
会即时创建一个新密钥——因此您不必关心初始化或创建您的值的副本。