你可以创建自己的字典类来获得所需的行为。我不确定什么是最好的方法,但这里有一个可能性:
import collections
class ListDict(collections.UserDict):
def update(self, other):
if isinstance(other, collections.Mapping):
for key, value in other.items():
self.data.setdefault(key, []).extend(value)
else:
raise NotImplementedError()
dic1 = ListDict({'math': ['algebra', 'trigonometry', 'geometry']})
dic2 = ListDict({'math': ['calculus'], 'science': ['physics']})
dic2.update(dic1)
print(dic2)
输出:
{'math': ['calculus', 'algebra', 'trigonometry', 'geometry'], 'science': ['physics']}
请注意,这只是实现所需行为的开始。根据您使用它的目的,您可能需要添加更多功能。例如,只有
调用update
的方法之一被实现。
为了防止结果集合中出现重复值,您可能希望改用集合:
import collections
class SetDict(collections.UserDict):
def update(self, other):
if isinstance(other, collections.Mapping):
for key, value in other.items():
self.data[key] = self.data.get(key, set()).union(value)
else:
raise NotImplementedError()
dic3 = SetDict({'math': ['algebra', 'trigonometry']})
dic4 = SetDict({'math': {'algebra', 'geometry'}})
dic4.update(dic3)
print(dic4)
输出:
{'math': {'algebra', 'geometry', 'trigonometry'}}
dic3 = {k: v + dic1.get(k, list()) for k, v in dic2.items()}
。 - Cory Maddendic1
仅包含dic2
中存在的键。我觉得我表达得有些奇怪。 - Cory Madden