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

2024-10-02 10:23:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典列表如下:

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

我正在使用python脚本根据剧集名称自动添加新词典(show name和解析的季号)(例如“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和第2季的组合,并且只有在列表中的同一词典中存在此特定组合时才会变为False


Tags: name名称列表if字典anyparsed节目
3条回答

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

knownShows = [
    {'Parsed Name': 'A', 'Parsed Season':'1', 'Override?': 'N', 'NewName': '', 'NewSeason': ''},
    {'Parsed Name': 'B', 'Parsed Season':'1', 'Override?': 'N', 'NewName': '', 'NewSeason': ''},
    {'Parsed Name': 'C', 'Parsed Season':'2', 'Override?': 'N', 'NewName': '', 'NewSeason': ''},
    {'Parsed Name': 'D', 'Parsed Season':'1', 'Override?': 'N', 'NewName': '', '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

如果您对数据结构有控制,您可能需要考虑将数据存储在字典中而不是列表:

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

# build the keyed dictionary
keyed_known_shows = {}
for d in knownShows:
    key = (d["Parsed Name"], d["Parsed Season"])
    keyed_known_shows[key] = d
    

这样,您就可以直接哈希到所需的条目,而不必迭代数据

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

True

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

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

相关问题 更多 >

    热门问题