代码之家  ›  专栏  ›  技术社区  ›  Usman Maqbool Tayyab Javed

筛选关键字值较高的词典列表删除重复词典

  •  3
  • Usman Maqbool Tayyab Javed  · 技术社区  · 6 年前

    我有一个字典列表,比如:

    sel_list = [{'a': 8}, {'a': 4}, {'a': 4}, {'b': 8}, {'b': 9}]
    

    我要删除重复的词典,如果多个词典具有相同的键但值不同,请选择值较高的词典。

    比如:

    sel_list = [{'a': 8}, {'b': 9}]
    

    我试过:

    [i for n, i in enumerate(sel_list) if i not in sel_list[n + 1:]]
    

    其结果是:

    [{'a': 8}, {'a': 4}, {'b': 8}, {'b': 9}]
    

    我能做些什么来达到我的目标?

    4 回复  |  直到 6 年前
        1
  •  7
  •   willeM_ Van Onsem    6 年前

    我们可以通过构造 词典 通过每次选择最大值来“折叠”这些值。比如:

    dummy = object()
    maximums = {}
    for subd in sel_list:
        for k, v in subd.items():
            cur = maximums.get(k, dummy)
            if cur is dummy or v > cur:
                maximums[k] = v
    result = [{k: v} for k, v in maximums.items()]
    

    因此,我们迭代 关键值 列表中的词典对,每次更新 maximums 在密钥尚未存在的情况下,或者当前值较少的情况下,字典。

    在这个迭代步骤之后,我们将生成一个具有最大键值对的字典列表。

    这种方法适用于所有类型的 可以 排序(数字、字符串等),键应该是散列的,但是这个假设成立,因为在字典列表中,键已经被散列了。

    此外,它的工作相当健壮,因为它将忽略空字典,并将处理具有多个键值对的字典,方法是将这些键值对视为独立的键值对。

    你也可以决定和 最大值 直接:包含原始列表中所有键的字典,并将它们与列表中看到的最大值相关联。

        2
  •  2
  •   JPG    6 年前

    免责声明 :我不知道多少钱 蟒蛇 是我的解决办法

    假设 dict 包含 只有一个 键,值对。(即, {"a":2,"b":3} 不是有效的dict)

    sel_list = [{'a': 0}, {'a': 4}, {'a': 4}, {'b': 8}, {'b': 9}, {'d': 9}]
    result_dict = {}
    for item in sel_list:
        key = list(item.keys())[0]
        if key in result_dict:
            if item[key] > result_dict[key][key]:
                result_dict.update({key: item})
        else:
            result_dict.update({key: item})
    result_list = [v for k, v in result_dict.items()]
    print(result_list)
    
        3
  •  1
  •   Platos-Child    6 年前

    代码:

    from collections import defaultdict
    
    sel_list = [{'a': 8}, {'a': 4}, {'a': 4}, {'b': 8}, {'b': 9}]
    
    results = defaultdict(list)
    
    for element in sel_list:
        for key, value in element.items():
            results[key].append(value)
    
    for item_key, item_value in results.items():
        results[item_key] = max(item_value)
    
    print(results)
    

    输出:

    defaultdict(<class 'list'>, {'b': 9, 'a': 8})
    
        4
  •  0
  •   Reut Sharabani    6 年前

    你可以通过 reduce 操作中 dict 您的州:

    from functools import reduce
    from itertools import chain
    
    sel_list = [{'a': 8}, {'a': 4}, {'a': 4}, {'b': 8}, {'b': 9}]
    
    # function to aggregate max value item into a `dict`
    def agg(d, kv):
        k, v = kv
        d[k] = max(d.get(k, v), v)
        return d
    
    # concatenate all items from all `dict`s
    sel_items = chain.from_iterable(map(dict.items, sel_list))
    
    # aggregate using a single `dict` which implicitly holds required semantics
    result = reduce(agg, sel_items, {}) # {'a': 8, 'b': 9}  <-- better?
    

    获取输出格式(即 有利条件 迪克特 国际海事组织):

    formatted = [dict((item, )) for item in result.items()]
    

    迪克特 有利于你的语义学。我认为这是一个更好的数据结构。