如果嵌套字典中存在值,则查找键

2024-10-03 17:23:31 发布

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

我正在使用python3.6,我需要遍历嵌套字典来查找是否存在指定的值,如果存在,则存储与该值对应的所有键。我还需要扩展这些条件,以便能够存储指定子字典键的指定值存在的键。在

词典的构建如下:

dict = {A: {B: [a, b, c], C: [d, c, e]}, D: {B: [f, g, h], E: [i, j, c]}...}

每个主键(A、D等)都是唯一的,但是子字典中的键在不同的子字典中重复。在

我想得到所有的主键,其值如“c”存在,因此输出将是:

^{pr2}$

我还想为子字典键添加条件,例如,为“B”子字典键获取“c”存在的所有主键。这里的输出是:

foundKeys = [A]

对于第一个条件,我想到了下面的代码:

myList = list(dict.keys())

foundKeys = []

for i in range(0,len(myList)):
    tmpList = list(dict.get(myList[i],{}).values())
    for j in range(0, len(tmpList)):
        for k in range(0, len(tmpList[j])):
            if "c" in tmpList[j][k]:
                if myList[i] not in foundKeys:
                    foundKeys.append(myList[i])

这使我可以得到一个包含所有键的列表,这些键具有相应的值“c”([a,D]),但是我有一个很大的数据集,我意识到可能有更好的方法来处理这个问题。在

我可以修改此代码以添加子字典键条件并获得输出[A],但运行它需要更多的时间。在

我是Python新手,还在学习如何优化。你能告诉我在处理大型数据集时如何处理这个问题?在


Tags: 数据代码inforlenif字典range
3条回答

你可以用这样的方法来做得更快:

>>> result = []
>>> for key, subdict in d.items():
...     for sublist in subdict.values():
...         if "c" in sublist:
...             result.append(key)
...             break
... 
>>> print(result)
['A', 'D']

注意使用itemsvalues作为迭代dict元素的方法。在

在字典结构中循环所有元素。一旦你发现一个事件,你应该尽快打破这个循环。下面是一个使用列表理解的单行线:

d = {'A': {'B': ['a', 'b', 'c'], 'C': ['d', 'c', 'e']}, 'D': {'B': ['f', 'g', 'h'], 'E': ['i', 'j', 'c']}}

found_keys = [k for k, v in d.items() if any("c" in l for l in v.values())]

如果要按子字典键进行筛选,它甚至更短:

^{pr2}$

您可以使用内置的.keys().values()分别直接获取键和值。在

代码:

dict = {'A': {'B': ['a', 'b', 'c'], 'C': ['d', 'c', 'e']}, 'D': {'B': ['f', 'g', 'h'], 'E': ['i', 'j', 'c']}}

listOfKeys = []
for i in dict.keys():
    for j in dict[i].values():
        if 'c' in j:
            if i not in listOfKeys:
                listOfKeys.append(i)

print(listOfKeys)

输出:

^{pr2}$

相关问题 更多 >