Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列出嵌套字典中的重复值_Python_Dictionary_Duplicates - Fatal编程技术网

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
而不是追加。