识别包含特定键值对的词典的“名称”的最快方法是什么?

2024-09-25 14:27:15 发布

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

我想在下面的列表中标识包含键值对“Keya”的字典:“123a”,在本例中是ID1。你知道吗

lst = {ID1:{'Keya':'123a','Keyb':456,'Keyc':789},ID2:{'Keya':'132a','Keyb':654,'Keyc':987},ID3:{'Keya':'5433a','Keyb':222,'Keyc':333},ID4:{'Keya':'444a','Keyb':777,'Keyc':666}}

可以安全地假设所有字典都有相同的键,但值不同。你知道吗

目前,我有以下方法来确定哪个字典的键“Keya”的值为“123a”,但是有没有一种更短更快的方法?你知道吗

    DictionaryNames = map(lambda Dict: str(Dict),lst)
    Dictionaries = [i[1] for i in lst.items()]
    Dictionaries = map(lambda Dict: str(Dict),Dictionaries) 

    Dict = filter(lambda item:'123a' in item,Dictionaries)
    val = DictionaryNames[Dictionaries.index(Dict[0])]
    return val

Tags: 方法lambdainmap字典itemdictlst
3条回答

如果你真的有一个字典列表,这将是:

next(d for d in list_o_dicts if d[key]==value)

因为您实际上有一个字典字典,并且您需要与字典关联的键,所以它是:

next(k for k, d in dict_o_dicts.items() if d[key]==value)

这将返回第一个匹配值。如果你绝对确定只有一个,或者如果你不在乎你得到的是多个,如果你对一个StopIteration例外感到满意,如果你错了,没有一个例外,那就是你想要的。你知道吗

如果需要所有匹配的值,只需对列表执行相同的操作:

[k for k, d in dict_o_dicts.items() if d[key]==value]

当然,该列表可以有0、1或17个值。你知道吗

既然你想要最快的速度,你应该缩短你的搜索,一旦你找到你要找的数据。不需要遍历整个列表,也不需要生成任何临时字典:

for key,data in lst.iteritems():
    if data['Keya']=='132a':
        return key   #or break is not in a function

您只需执行[name for name, d in lst.iteritems() if d['Keya']=='123a']即可获得lst中具有该键值的所有词典的列表。如果你知道只有一个,你可以用[name for name, d in lst.iteritems() if d['Keya']=='123a'][0]得到它。(正如安迪在评论中提到的,你的名字lst令人误解,因为lst实际上是一本词典,而不是一个列表。)

相关问题 更多 >