Python-比较两个字典[匹配区分大小写的值]
我试图比较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
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对我可以使用的字符数有限制,因此代码越小越好。无论如何,感谢您的帮助!:)