【问题标题】:Python - Combine number of dictionaries with conditional concatenationPython - 将字典数量与条件连接相结合
【发布时间】:2016-05-20 21:43:33
【问题描述】:

我有许多输出(从数据库查询中收集)并映射到带有键:值对 db_column: value 的字典中

我要合并的样本数据:

dicts1 = [ 
      {'K1': 'kval', 'L1': 'Lval', 'F1': None, 'F2': None, 'F3': 'ERR1'},
      {'K1': 'kval', 'L1': 'Lval', 'F1': None, 'F2': None, 'F3': 'ERR1'},
      {'F1': None, 'F2': None, 'F3': 'ERR2'}]

现在我想将这些字典组合成一个字典,但 F1F2F3 中的值应与 ; 连接,如果不是 None。如果是None,则保持原样。 理想情况下:如果special_key=('F1', 'F2', 'F3') 中存在某个键,则连接..

result_dict: {'K1': 'kval', 'L1': 'Lval', 'F1': None, 'F2': None, 'F3': 'ERR1;ERR2;ERR3'}

基于以下问题:Python - Combine two dictionaries, concatenate string values? 我想出了一些代码并卡住了

def concat_dict(*dicts):
    keys = set().union(*dicts)
    print "keys: ", keys
    outdict = {}
    for k in keys:
        print "key: ", k
        for dic in dicts:
            print k, dic.get(k)
            outdict[k] = dic.get(k)

任何帮助表示赞赏。

【问题讨论】:

    标签: python


    【解决方案1】:

    这就是你要找的吗?

    dicts1 = [
          {'K1': 'kval', 'L1': 'Lval', 'F1': None, 'F2': None, 'F3': 'ERR1'},
          {'K1': 'kval', 'L1': 'Lval', 'F1': None, 'F2': None, 'F3': 'ERR1'},
          {'F1': None, 'F2': None, 'F3': 'ERR2'}]
    
    special_keys = ['F1', 'F2', 'F3']
    
    def concat_dict(dicts1):
        outdict = {}
        for dictionary in dicts1:
            for key, value in dictionary.items():
                #FOr special keys
                if key in special_keys:
                    #Check first if key is already inserted in outdict
                    if key not in outdict or not outdict[key]:
                        outdict[key] = value
                    #Else only if value is not None, do concatenation
                    elif value:
                        outdict[key] = '{prepend};{newValue}'.format(prepend=outdict[key], newValue=value)
                else:
                    outdict[key] = value
    
        return outdict
    

    输出

    {'K1': 'kval', 'F1': None, 'F3': 'ERR1;ERR1;ERR2', 'L1': 'Lval', 'F2': None}
    

    【讨论】:

    • 好像没问题。我将尝试尽可能接近 Dict 理解,但对于初学者来说,这是可以接受的。谢谢!
    【解决方案2】:

    首先,concat_dict 不会返回新的字典或修改现有的字典。所以你不会得到任何东西。

    其次,需要传入特殊键列表。

    第三,您需要决定如何处理密钥。目前 concat_dict 正在覆盖它基于顺序的任何值。无论键是否特殊,您似乎都希望保留非空值。

    以下功能将为您提供您想要的,但我并不认为它是最佳的。如果您想要更多自定义,您可能可以传递另一个函数来自定义如何处理特殊键。

    def concat_dict(special_keys, *dicts):
        keys = set().union(*dicts)
        outdict = {}
        for k in keys:
            for dic in dicts:
                if dic.has_key(k):
                    if k in special_keys:
                        if outdict.has_key(k) and dic[k] is not None:
                            outdict[k] = outdict[k] + ";" + dic[k]
                        else:
                            outdict[k] = dic[k]
                    else:
                        outdict[k] = dic.get(k)
        return outdict
    

    【讨论】:

    • dicts1 = [{'K1': 'kval', 'L1': 'Lval', 'F1': None, 'F2': None, 'F3': 'ERR1'}, {'K1': 'kval', 'L1': 'Lval', 'F1': None, 'F2': None, 'F3': 'ERR1'}, {'F1': None, 'F2': None, 'F3': None}] 将导致 F3: None 但无论如何,我会为您的解决方案工作。此外 has_key 已折旧 -> stackoverflow.com/questions/1323410/has-key-or-in
    • 我一般使用 2.7,因为我使用的一些库没有最好的 3.X 支持。
    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多