我在组合或计算这两个词典的共同/相等部分时遇到问题。在我的词典中,值列表:
d1 = {0:['11','18','25','38'],
1:['11','18','25','38'],
2:['11','18','25','38'],
3:['11','18','25','38']}
d2 = {0:['05','08','11','13','16','25','34','38','40', '43'],
1:['05', '08', '09','13','15','20','32','36','38', '40','41'],
2:['02', '08', '11', '13', '18', '20', '22','33','36','39'],
3:['06', '11', '12', '25', '26', '27', '28', '30', '31', '37']}
我想检查“d2”并知道“d1”中是否有数字。如果有一些,我想用新数据更新其中一个或接收第三个字典“d3”,只有“d1”和“d2”中相同/相等的值,如:
d3 = {0:['11','25','38'], 1:['38'], 2:['11','18'], 3:['11','25']}
任何人都可以帮我吗?
我的错,我忘了更具体。我正在寻找Python的解决方案。
答案 0 :(得分:7)
假设这是Python,你想要:
dict((x, set(y) & set(d1.get(x, ()))) for (x, y) in d2.iteritems())
生成结果字典“d3”。
>>> d3 = {k: list(set(d1.get(k,[])).intersection(v)) for k, v in d2.items()}
{0: ['11', '25', '38'], 1: ['38'], 2: ['11', '18'], 3: ['11', '25']}
以上版本(以及Python 2.x版本)允许空交叉点,因此在一般情况下需要额外的过滤:
>>> d3 = {k: v for k, v in d3.items() if v}
将上述内容合并为一遍:
d3 = {}
for k, v in d2.items():
# find common elements for d1 & d2
v3 = set(d1.get(k,[])).intersection(v)
if v3: # whether there are common elements
d3[k] = list(v3)
[编辑:我发布了这个帖子社区维基,以便人们可以根据需要改进它。我承认,如果你不习惯用Python阅读这类东西,可能会有点难以阅读。]
答案 1 :(得分:4)
提供更具可读性的解决方案:
d3= {}
for common_key in set(d1) & set(d2):
common_values= set(d1[common_key]) & set(d2[common_key])
d3[common_key]= list(common_values)
如果您只想要具有至少一个公共值项的键:
d3= {}
for common_key in set(d1) & set(d2):
common_values= set(d1[common_key]) & set(d2[common_key])
if common_values:
d3[common_key]= list(common_values)
如果订单和重复项不重要,您可以将d1和d2值保留为集合而不是列表。
答案 2 :(得分:1)
问题归结为确定两个条目之间的共同元素。 (要获得所有条目的结果,只需将代码放在所有条目的循环中。)此外,看起来每个条目都是一个集合(即它没有重复的元素)。因此,您需要做的就是找到这些元素之间的集合交集。许多语言都提供了这样做的方法或功能;例如,在C ++中使用set容器和set_intersection函数。这比将一组中的每个元素与另一组中的元素进行比较要高效得多,正如其他人提出的那样。
答案 3 :(得分:1)
如果我们可以假设d1和d2具有相同的键:
d3 = {}
for k in d1.keys():
intersection = set(d1[k]) & set(d2[k])
d3[k] = [x for x in intersection]
否则,如果我们不能假设,那就有点麻烦了:
d3 = {}
for k in set(d1.keys() + d2.keys()):
intersection = set(d1.get(k, [])) & set(d2.get(k, []))
d3[k] = [x for x in intersection]
修改:考虑到评论的新版本。这个只检查d1和d2共有的键,这就是海报似乎要问的内容。
d3 = {}
for k in set(d1.keys()) & set(d2.keys()):
intersection = set(d1[k]) & set(d2[k])
d3[k] = list(intersection)
答案 4 :(得分:-1)
:
Dictionary d3 = new Dictionary()
for (i = 0 to min(d1.size(), d2.size()))
{
element shared = getSharedElements(d1[i], d2[i]);
d3.store(i, shared);
}
function getsharedElements(array e1, array e2)
{
element e3 = new element();
for (int i = 0 to e1.length)
{
if (e2.contains(e1[i]))
{
e3.add[e1[i]];
}
}
return e3;
}