Python 3.x 在python中合并单个字典的两个键

Python 3.x 在python中合并单个字典的两个键,python-3.x,mergeddictionaries,Python 3.x,Mergeddictionaries,对于字典“a”,键“x、y和z”包含整数值。 如果我想合并字典中的两个键(考虑到键的大小相同且值为整数类型),那么生成联合列表的最有效方法是什么 x+y和y+z 说明: 假设您必须合并两个键,并将它们合并到一个新的列表或新的dict中,而不更改原始词典 例如: a = {"x" : {1,2,3,....,50} "y" : {1,2,3,.....50} "z" : {1,2,3,.....50} } 所

对于字典“a”,键“x、y和z”包含整数值。 如果我想合并字典中的两个键(考虑到键的大小相同且值为整数类型),那么生成联合列表的最有效方法是什么

x+y和y+z

说明:

假设您必须合并两个键,并将它们合并到一个新的列表或新的dict中,而不更改原始词典

例如:

a = {"x" : {1,2,3,....,50}
     "y" : {1,2,3,.....50}
     "z" : {1,2,3,.....50}
    }
所需列表:

x+y = [2,4,6,8.....,100]
y+z = [2,4,6,......,100]

似乎您正在尝试模拟一个
连接
类型的操作。这不是python dicts所固有的,因此如果您真的想要这种类型的功能,我建议您查看
pandas

如果您只想合并dict密钥而不使用更高级的功能,则此功能应有助于:

from itertools import chain
from collections import Counter
from typing import Dict, List, Set, Tuple

def merge_keys(data: Dict[str, Set[int]], *merge_list: List[Tuple[str, str]]):
    merged_data = dict()
    merged_counts = Counter(list(chain(*map(lambda k: list(data.get(k, {})) if k in merge_list else [], data))))
    merged_data['+'.join(merge_list)] = [k*v for k,v in merged_counts.items()]
    return merged_data
您可以使用
merge_键(a,“x”,“y”,“z”,“…)
)运行此函数,其中
a
是dict的名称-您可以放置任意数量的键(“x”,“y”,“z”,“…”),因为此函数的参数数量可变

如果要在同一个目录中进行两个单独的合并,只需执行以下操作:

b = merge_keys(a, "x", "y") | merge_keys(a, "y", "z")
请注意,关键点的顺序会更改最终合并的关键点(“y+z”vs“z+y”),但不会更改其合并集的值


附言:这实际上有点棘手,因为最初的dict有设置值,而不是列表,它们没有顺序,所以不能只按元素添加它们。这就是为什么我在这里使用了
计数器
,以防您感到奇怪。

一种非常有效的方法是将字典转换为pandas数据帧,并允许它使用其矢量化方法为您完成这项工作:

import pandas as pd

a = {"x" : range(1,51), "y" : range(1,51), "z" : range(1,51)}

df = pd.DataFrame(a)
x_plus_y = (df['x'] + df['y']).to_list()
y_plus_z = (df['y'] + df['z']).to_list()

print(x_plus_y)
#[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

非常感谢。我真的很感激it@VidyaMurthy不客气。在堆栈溢出问题上,正确的礼仪是如果答案对您有效,则接受/向上投票。非常感谢。我做到了。我无法提高投票率,因为声誉很低:PI通过提高你的问题的投票率来提高你的声誉。你现在应该有特权了。谢谢你的时间,我对答案投了赞成票。谢谢你的技巧。