如何从python字典列表中提取重复的键和值?
我有一个从产品及其变体中提取的DICT列表,其定义如下:如何从python字典列表中提取重复的键和值?,python,dictionary,duplicates,Python,Dictionary,Duplicates,我有一个从产品及其变体中提取的DICT列表,其定义如下: attribute_list = [ {'Finish': 'Chrome'}, {'Size': 'Large'}, {'Weight': '1.6kg'}, {'Finish': 'Chrome'}, {'Weight': '1.9kg'} ] 我希望创建两个列表,其中一个列表中的DICT不重复,即: compiled_list = [ {'Finish': 'Chrome'}
attribute_list = [
{'Finish': 'Chrome'},
{'Size': 'Large'},
{'Weight': '1.6kg'},
{'Finish': 'Chrome'},
{'Weight': '1.9kg'}
]
我希望创建两个列表,其中一个列表中的DICT不重复,即:
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)
当您将
属性
附加到重复列表
时,必须使用类似键检查已编译列表
中的任何其他现有属性,并将其从已编译列表
中删除,然后附加到重复列表
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'}]
或者,您可以将词典列表重组为
set
对象的defaultdict
然后使用两种列表理解法将孤立项与重复项分开:
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'}]
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
此解决方案涉及使用Pandas,这是一个更适合数据管理的Python包。你会明白为什么:
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'}]
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'}
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()]
这些是你展示的清单还是口述?语法是两种语言的混合体,文本上写着“dict列表”。它们可能都是单独的dict。是的,它们都是单独的dict,对不够清晰表示歉意。@PeteDermott为什么
{'Finish':'Chrome'}
在编译后的列表中没有重复?问题:更改数据类型可以吗?在我看来,这似乎是一个糟糕的选择列表+口述。完美!非常感谢。