Python-比较两个字典[匹配区分大小写的值]

Python-比较两个字典[匹配区分大小写的值],python,dictionary,Python,Dictionary,我试图比较Python中的两个字典(包含数组的列表) 这里有两本字典: tag=[{'Key': 'Base', 'Value': 'ny'}, {'Key': 'Name', 'Value': 'newyork'}] filters=[{'Key': 'Name','Value': ['Newyork', 'newyork','NewYork']}] 这里的任务是比较过滤器dict与标签dict 以下是我尝试过的不起作用的方法: >>> tag == filters Fa

我试图比较Python中的两个字典(包含数组的列表)

这里有两本字典:

tag=[{'Key': 'Base', 'Value': 'ny'}, {'Key': 'Name', 'Value': 'newyork'}]

filters=[{'Key': 'Name','Value': ['Newyork', 'newyork','NewYork']}]
这里的任务是比较
过滤器
dict与
标签
dict

以下是我尝试过的不起作用的方法:

>>> tag == filters
False
>>> tag[1] == filters
False
>>> tag[1] == filters[0]
False
我想检查
标记
是否有与
过滤器匹配的数组
它应该返回
true

可能,它能够比较数组中
的值,因为它有一个精确匹配的字符串,但是对于
在不同情况下写入相同字符串,它不匹配

比较时,我想介绍的内容:

  • 如果任何数组匹配,则将其与字典中的每个数组进行比较,结果应返回true
  • 考虑
    的所有可能情况:
    'Name','Name','Name'
    'Newyork','Newyork','Newyork'
谢谢你的帮助。
提前谢谢

开始时,这些数据结构非常奇怪,但我认为它们是aws cli/api返回的类型。我打赌有一种cli/api方法可以过滤您试图做的事情,您应该发布一个关于您试图从aws()查询什么的问题。但暂时忽略这一点:

请注意,
tag
不是字典,而是字典列表。您需要首先选择包含
Key:Name
的词典

next(element for element in tag if element['Key'] == 'Name')
=> {'Key': 'Name', 'Value': 'newyork'}
或者更确切地说,您希望选择具有与筛选器相同的
键:xxx
的词典

next(element for element in tag if element['Key'] == filters[0]['Key'])
=> {'Key': 'Name', 'Value': 'newyork'}
现在,您需要将所选词典中的
与过滤器

selectedDict=next(element for element in tag if element['Key'] == filters[0]['Key'])
selectedDict['Value'] in filters[0]['Value']
=> True
一句话,

next(element for element in tag if element['Key'] == filters[0]['Key'])['Value'] in filters[0]['Value']
=> True

这会将字典的大小写转换为小写,丢弃多余的大小写(如NewYork、NewYork等),并比较返回的字典是否匹配

import re

tag=[{'Key': 'Base', 'Value': 'ny'}, {'Key': 'Name', 'Value': 'newyork'}]
filters=[{'Key': 'Name','Value': ['Newyork', 'newyork','NewYork']}]

def dict_to_lower(dct):
    tmp = []
    for item in dct:
        #check for one value, change to lower case
        if re.search(r'[\,]', str(item['Value'])) is None:
            item['Key'] = str(item['Key']).lower()
            item['Value'] = str(item['Value']).lower()
            tmp.append(item)
        #else multiple values in list, change to lower, discard all but one
        else:
            item['Key'] = str(item['Key']).lower()
            item['Value'] = re.search(r'(\w+)', str(item['Value']).lower()).group(0)
            tmp.append(item)

    dct = tmp


    return dct

def compare_lists(tag, filters):
    #compare tag to filters return matches
    check = set([(d['Key'], d['Value']) for d in filters])
    return [d for d in tag if (d['Key'], d['Value']) in check]

tag = dict_to_lower(tag)
filters = dict_to_lower(filters)

if compare_lists(tag, filters):
    #Rest of your code here

你能添加更多的例子和预期的结果吗?我不太明白你到底在比较什么?@Deuce我已经添加了我脚本中的片段。希望能有所帮助。遗憾的是,这没有多大帮助。你在文章开头给出的措辞似乎与你在代码中得到的实际措辞不匹配?例如,
filter=[{'Key':['Keep'],'Values':['True','True'],'True']}]
从一开始就不同于
过滤器=[{'Name':'tag:Keep','Values':['True','True']}]
从您的代码片段中。这真的很让人困惑。Alors,是
标记=[{'Key':'Base','Value':'MyImage1'},{'Key':'Keep','Value':'True'},{'Key':'Name','Value':'TestBaseImage'}]
实际上你有什么?看起来很奇怪?为什么要用一个dict来代替{'Key':'Value':'Value'}而不是{'Key':'Value'}?@Deuce我用一个更清晰的例子来说明我想做什么,从而完善了整个问题。希望这次能说清楚。谢谢你的解决方案。事实上,我想用AWS标签做点什么,实际上我想过滤它们。我已经想出了一个解决方案(很长的版本)但我想了解我可以用的其他方法。我问这个问题是因为我没有找到任何适当的帮助。也许你的解决方案可以帮助人们以多种不同的方式解决此类问题。:)谢谢Pete提供的解决方案。您的解决方案肯定会奏效,但我正在寻找一种更有效的方法来解决此类问题,因为我使用的AWS Lambda对我可以使用的字符数有限制,因此代码越小越好。无论如何,感谢您的帮助!:)