我有一个从产品及其变体中获取的字典列表,其定义如下:
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)
答案 0 :(得分:1)
此解决方案涉及使用 Pandas ,这是一个更适合数据管理的Python软件包。您将看到原因:
首先,我们将字典列表转换为熊猫。在这里,我们删除精确的重复项:
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
现在,我们应用搜索功能。使用熊猫非常容易:
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
现在,我们将转换回原始的字典列表:
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()]
答案 1 :(得分:0)
将attribute
附加到duplicate_list
时,必须使用相似的密钥检查compiled_list
中的其他任何退出属性,并将其从compiled_list
中删除并将其附加到{ {1}}
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)
答案 2 :(得分:0)
或者,您可以将字典列表重组为defaultdict
个对象中的set
个。
然后使用几个列表推导将孤立的项目与重复项分开:
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'}]