如何检查列表中的字典中是否存在值的特定组合?

问题描述

我有一个字典列表,如下所示:

kNownShows = [
    {'Parsed Name': 'A','Parsed Season':'1','Override?': 'N','NewName': '','NewSeason': ''},{'Parsed Name': 'B',{'Parsed Name': 'C','Parsed Season':'2',{'Parsed Name': 'D','NewSeason': ''}
]

并且我正在使用python脚本根据剧集名称(例如,“ A-s01e02”变为已解析名称“ A”,而已解析季节“ 1”)自动添加新字典(具有已解析季节编号的显示名称)。

有什么方法可以检查列表中的字典中是否已经存在键/值对的特定组合?

我正尝试使用this solution修改版本,将其转换为

if not (any(d['Parsed Name'] == showName for d in kNownShows) and any(d['Parsed Season'] == str(season) for d in kNownShows)):

但是当解析列表中的同一节目有多个季节时,这已经开始引起问题。

例如,我有一集具有以下节目/季节组合的剧集:

'Parsed Name' = "A"
'Parsed Season' = "2"

由于两者都存在:列表中已经存在一个名为“ A”的节目和一个季节“ 2”,因此不会为A的第2季创建新条目。

是否有任何方法可以更改if语句以检查Show A和Season 2的组合,并且仅当该特定组合存在于列表中的同一词典中时才将其设置为False?

解决方法

您可以通过以下方式在列表理解内使用AND:

if not any((d['Parsed Name'] == showName and d['Parsed Season'] == str(season)) for d in knownShows):
,

您可以使用列表推导将名称和季节合并到单个字段中并进行检查。

knownShows = [
    {'Parsed Name': 'A','Parsed Season':'1','Override?': 'N','NewName': '','NewSeason': ''},{'Parsed Name': 'B',{'Parsed Name': 'C','Parsed Season':'2',{'Parsed Name': 'D','NewSeason': ''}
]

def entryexists(name,season):
    s = [d['Parsed Name']+'|'+d['Parsed Season'] for d in knownShows]
    if name+'|'+season in s:
        return True
    return False
    

print(entryexists('A','1'))
print(entryexists('D','2'))

输出

True
False
,

如果您可以控制数据结构,则可以考虑将数据存储在字典中而不是列表中:

new_key = ("A","1")
new_key in keyed_known_shows

这样,您就可以直接对所需条目进行哈希处理,而不必遍历数据。

const Item = ({ item,onPress }) => (