【问题标题】:Merge two keys of a single dictionary in python在python中合并单个字典的两个键
【发布时间】:2021-03-11 22:36:20
【问题描述】:

对于字典“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]

【问题讨论】:

    标签: python-3.x mergeddictionaries


    【解决方案1】:

    一种非常有效的方法是将字典转换为 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]
    

    【讨论】:

    • 谢谢!我真的很感激
    • @VidyaMurthy 非常欢迎您。 Stack Overflow 上的正确礼仪是接受/赞成答案,如果它对你有用。 stackoverflow.com/help/someone-answers
    • 谢谢!我做到了..由于声誉低,我无法投票:P
    • 我通过支持您的问题提高了您的声誉。你现在应该有特权了。
    • 感谢您的宝贵时间,我对答案投了赞成票。
    【解决方案2】:

    您似乎在尝试模仿join-type 操作。这不是 python dicts 所固有的,所以如果你真的想要那种类型的功能,我建议你查看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 的原因,以防你想知道。

    【讨论】:

    • 感谢您的技术。
    猜你喜欢
    • 1970-01-01
    • 2022-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2017-12-29
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多