Python 列出嵌套字典中的重复值
我需要检查字典中可能出现的重复值。我有一本字典,布局如下。欢迎任何建议!非常感谢 原始词典Python 列出嵌套字典中的重复值,python,dictionary,duplicates,Python,Dictionary,Duplicates,我需要检查字典中可能出现的重复值。我有一本字典,布局如下。欢迎任何建议!非常感谢 原始词典 dic = {'ab1': [{'ans': 'Male', 'val': '1'}, {'ans': 'Female', 'val': '2'}, {'ans': 'Other', 'val': '3'}, {'ans': 'Prefer not to answer', 'val': '3'}], 'bc1': [{'ans': 'Employed', 'val': '1'}, {'a
dic = {'ab1': [{'ans': 'Male', 'val': '1'},
{'ans': 'Female', 'val': '2'},
{'ans': 'Other', 'val': '3'},
{'ans': 'Prefer not to answer', 'val': '3'}],
'bc1': [{'ans': 'Employed', 'val': '1'},
{'ans': 'Unemployed', 'val': '2'},
{'ans': 'Student', 'val': '3'},
{'ans': 'Retired', 'val': '4'},
{'ans': 'Part-time', 'val': '5'},
{'ans': 'Prefer not to answer', 'val': '7'}],
'bc2': [{'ans': 'Mother',
'val': '1'},
{'ans': 'Father ', 'val': '2'},
{'ans': 'Brother', 'val': '3'},
{'ans': 'Sister', 'val': '4'},
{'ans': 'Grandmother', 'val': '4'},
{'ans': 'Grandfather', 'val': '6'},
{'ans': 'Son', 'val': '7'},
{'ans': 'Daughter', 'val': '8'}]}
预期输出-仅包含每个键具有相同值的项的列表-因此
ab1: Other 3, Prefer not to answer 3
bc2: Sister 4, Grandmother 4
我尝试过的代码它的目标是首先反转字典-但我认为会抛出不可破坏的类型列表错误,因为它将其视为列表,而事实上dict可能是一个元组,但我不知道如何更改它
rev_dict = {}
for k, v in dic.items():
rev_dict.setdefault(v, set()).add(k)
res = set(chain.from_iterable(v for k, v in rev_dict.items()
if len(v) > 1))
熊猫的回答当然更好:
lst = []
for i in dic.keys():
counts = Counter([j['val'] for j in dic[i]])
new = {j['ans']: j['val'] for j in dic[i] if counts[j['val']] > 1}
lst.append(i + ': ' + ', '.join(['{} {}'.format(i, new[i]) for i in new])) if new else None
导入itertools并尝试以下操作:
list(itertools.chain(*[[(k, i['ans'],i['val']) for i in v] for k, v in dic.items()]))
长版本
import itertools
lst = []
for k,v in dic.items():
for i in v:
tup = (k, i['ans'],i['val'])
lst.append(tup)
list(itertools.chain(*lst))
您尚未指定确切的输出格式,但由于标记了
pandas
,因此这里有一个pandas
解决方案
import pandas as pd
{k: pd.DataFrame(v)[lambda df: df['val'].duplicated(keep=False)].to_dict(orient='records') for k, v in dic.items()}
输出:
{
'ab1': [{'ans': 'Other', 'val': '3'},
{'ans': 'Prefer not to answer', 'val': '3'}],
'bc1': [],
'bc2': [{'ans': 'Sister', 'val': '4'}, {'ans': 'Grandmother', 'val': '4'}]
}
感谢您的输入,但对我来说,这只是返回一个所有键值对的列表,如下所示。['ab1:男性1,女性2,其他3,不愿意回答3','bc1:就业1,失业2,学生3,退休4,兼职5,不愿意回答7','bc2:母亲1,父亲2,兄弟3,姐妹4,祖母4,祖父6,儿子7,女儿8'.
{j.get('ans'):j.get('val')代表dic中的j.get.get(i)}如果j.get('val')>1}
@br101 Tx,更新后做了正确的事情,尽管有更好的答案。hi@PawanJain-此代码打印字典中的所有项目,我只想打印每个项目val重复的情况-因此代码应仅打印ab1:Other 3,不希望回答3 bc2:Sister 4,奶奶4
但是谢谢你的尝试为什么你需要在这里贴上熊猫标签?太好了,非常感谢!正是我想要的。我只是想理解这个命令,所以我试着用这个out=[]for k,v in dic.items():print(k)I=pd.DataFrame(v)[lambda-df:df['val'].duplicated(keep=False)]。将它改写成一个长格式。追加(I)
,它只输出值,而不输出键(即ab1、bc1、bc2)。如果你有时间,你能指出我哪里出了问题吗?谢谢again@br101您正在用out=[]
构建一个列表。使用out={}
(空dict),然后使用out[k]=i
而不是追加。