在 python 中合并单个字典的两个键
Merge two keys of a single dictionary in python
对于字典“a”,键“x、y 和 z”包含整数值。
如果我想合并字典中的两个键(考虑到键的大小相同且值是整数类型),生成联合列表的最有效方法是什么?
x+y 和 y+z ? .
解释:
假设您必须合并两个键并将它们合并到一个新列表或新字典中而不改变原始字典。
示例:
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]
您似乎在尝试模仿 join
类型的操作。这不是 python 字典的原生功能,所以如果您真的想要那种类型的功能,我建议您查看 pandas
库。
如果您只想合并字典键而没有更多高级功能,此功能应该有所帮助:
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_keys(a, "x", "y", "z", ...)
,其中 a
是您的字典的名称 - 您可以输入任意数量的键(“x”、“y” , "z", ...), 因为这个函数接受可变数量的参数。
如果你想在同一个字典中进行两个单独的合并,你需要做的就是:
b = merge_keys(a, "x", "y") | merge_keys(a, "y", "z")
请注意,键的顺序会改变最终的合并键(“y+z”与“z+y”),但不会改变它们的合并集的值。
P.S:这实际上有点棘手,因为原始 dict 有设置值,而不是列表,它们没有排序,所以你不能只按元素添加它们。这就是我在这里使用 Counter
的原因,如果你想知道的话。
一种非常有效的方法是将字典转换为 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]
对于字典“a”,键“x、y 和 z”包含整数值。 如果我想合并字典中的两个键(考虑到键的大小相同且值是整数类型),生成联合列表的最有效方法是什么?
x+y 和 y+z ? .
解释:
假设您必须合并两个键并将它们合并到一个新列表或新字典中而不改变原始字典。
示例:
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]
您似乎在尝试模仿 join
类型的操作。这不是 python 字典的原生功能,所以如果您真的想要那种类型的功能,我建议您查看 pandas
库。
如果您只想合并字典键而没有更多高级功能,此功能应该有所帮助:
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_keys(a, "x", "y", "z", ...)
,其中 a
是您的字典的名称 - 您可以输入任意数量的键(“x”、“y” , "z", ...), 因为这个函数接受可变数量的参数。
如果你想在同一个字典中进行两个单独的合并,你需要做的就是:
b = merge_keys(a, "x", "y") | merge_keys(a, "y", "z")
请注意,键的顺序会改变最终的合并键(“y+z”与“z+y”),但不会改变它们的合并集的值。
P.S:这实际上有点棘手,因为原始 dict 有设置值,而不是列表,它们没有排序,所以你不能只按元素添加它们。这就是我在这里使用 Counter
的原因,如果你想知道的话。
一种非常有效的方法是将字典转换为 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]