【问题标题】:How to extract duplicate keys and values from a list of python dictionaries?如何从 python 字典列表中提取重复的键和值?
【发布时间】:2019-01-18 00:01:58
【问题描述】:

我有一个从产品及其变体中提取的字典列表,其定义如下:

attribute_list = [
    {'Finish': 'Chrome'},
    {'Size': 'Large'},
    {'Weight': '1.6kg'},
    {'Finish': 'Chrome'},
    {'Weight': '1.9kg'}
]

我正在寻找创建两个列表,一个列表中没有重复的字典,即:

compiled_list = [
    {'Finish': 'Chrome'}
    {'Size': 'Large'}
]

...以及另一个包含重复键和值的,即:

duplicates_list = [
    {'Weight': '1.6kg'}
    {'Weight': '1.9kg'}
]

下面是我到目前为止的代码,这让我有两个字典,但是 1)我认为这非常低效,2)我不知道如何删除重复字典的第一个实例.

compiled_list = list()
compiled_list_keys = list()
duplicates_list = list()
for attribute in attribute_list:
    for k, v in attribute.items():
        if k not in compiled_list_keys:
            compiled_list_keys.append(k)
            compiled_list.append(attribute)
        else:
            if attribute not in compiled_list:
                duplicates_list.append(attribute)
                compiled_list_keys.remove(k)

【问题讨论】:

  • 你展示的东西是列表还是字典?语法是两者的混合,文字是“list of dict”。
  • 他们每个人都可能是一个单独的字典。
  • 是的,他们是个别的 dicts 为缺乏明确性而道歉。
  • @PeteDermott 为什么{'Finish': 'Chrome'} 在compiled_list 中没有重复?
  • 问题:可以更改数据类型吗?在我看来,list + dict 的选择很糟糕。

标签: python dictionary duplicates


【解决方案1】:

此解决方案涉及使用 Pandas,这是一个更适合数据管理的 Python 包。你会明白为什么:

  1. 首先,我们将字典列表转换为 pandas。在这里,我们删除完全重复的内容:

    df = pd.DataFrame([list(attr.items())[0] for attr in attribute_list],
                      columns=['key', 'value']).drop_duplicates()
    #>      key     value
      0     Finish  Chrome
      1     Size    Large
      2     Weight  1.6kg
      4     Weight  1.9kg
    
  2. 现在我们应用我们的搜索功能。使用 pandas 非常容易:

    compiled_df = df.drop_duplicates(subset='key', keep=False)
    #>      key     value
      0     Finish  Chrome
      1     Size    Large
    duplicated_df=df[df.key.duplicated(keep=False)]
    #>      key     value
      2     Weight  1.6kg
      4     Weight  1.9kg
    
  3. 现在我们转换回原来的字典列表:

    compiled_list = [{item.key: item.value} for item in compiled_df.itertuples()]
    #> [{'Finish': 'Chrome'}, {'Size': 'Large'}]
    
    duplicated_list = [{item.key: item.value} for item in duplicated_df.itertuples()]
    #> [{'Weight': '1.6kg'}, {'Weight': '1.9kg'}
    

这可能不是最有效的方法,但它的用途要广泛得多。简而言之,5行代码:

df = pd.DataFrame([list(attr.items())[0] for attr in attribute_list],
                      columns=['key', 'value']).drop_duplicates()
compiled_df = df.drop_duplicates(subset='key', keep=False)
duplicated_df=df[df.key.duplicated(keep=False)]
compiled_list = [{item.key: item.value} for item in compiled_df.itertuples()]
duplicated_list = [{item.key: item.value} for item in duplicated_df.itertuples()]        

【讨论】:

  • 完美!谢谢!
【解决方案2】:

当您将attribute 附加到duplicate_list 时,您必须使用类似键检查compiled_list 中的任何其他现有属性,并将其从compiled_list 中删除并将其附加到duplicate_list

compiled_list = list()
compiled_list_keys = list()
duplicates_list = list()
for attribute in attribute_list:
    for k, v in attribute.items():
        if k not in compiled_list_keys:
            compiled_list_keys.append(k)
            compiled_list.append(attribute)
        else:
            if attribute not in compiled_list:
                exiting_attribute = [d for d in compiled_list if k in d][0]
                compiled_list.remove(exiting_attribute)
                duplicates_list.append(exiting_attribute)
                duplicates_list.append(attribute)
                compiled_list_keys.remove(k)
print (compiled_list)
print (duplicates_list)

输出

[{'Finish': 'Chrome'}, {'Size': 'Large'}]
[{'Weight': '1.6kg'}, {'Weight': '1.9kg'}]

【讨论】:

    【解决方案3】:

    或者,您可以将字典列表重组为 defaultdictset 对象。

    然后使用几个列表推导将孤立的项目与重复项分开:

    from collections import defaultdict
    
    d = defaultdict(set)
    
    for item in attribute_list:
        key, value = next(iter(item.items()))
        d[key].add(value)
    
    compiled_list = [{k: next(iter(v))} for k, v in d.items() if len(v) == 1]
    duplicates_list = [{k: w} for k, v in d.items() for w in v if len(v) > 1]
    
    print(compiled_list, duplicates_list, sep='\n')
    
    [{'Finish': 'Chrome'}, {'Size': 'Large'}]
    [{'Weight': '1.6kg'}, {'Weight': '1.9kg'}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-26
      • 2017-10-23
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 2022-11-21
      • 2019-06-04
      相关资源
      最近更新 更多