根据一个键查找多键字典的所有键

时间:2019-10-21 12:02:06

标签: python dictionary

我有一本字典,其中三个键分配给每个值:thinking_sphinx。我想检索与给定的单个键对应的所有值:dictTest[c,pH,T] = value

我在网上看了一下,但找不到Python中的任何解决方案,只有C#。我尝试使用dictTest[c,*,*] = value(s),但收到语法错误。我可以看到的另一个选项是使用多级键,即第一级为dictTest[c,*,*],第二级为c,依此类推,即pH(来自http://python.omics.wiki/data-structures/dictionary/multiple-keys)< / p>

以下是一些测试代码:

dictTest[c][pH][T] = value

以下给出了语法错误:

dictTest={}
dictTest[1,100,10]=10
dictTest[1,101,11]=11

尝试仅指定一个键时会出现键错误:

print(dictTest[1,*,*])

我也尝试了上面提到的多级键,但是当我尝试定义字典时会引发语法错误:

print(dictTest[1])

在上面的示例中,我只想指定第一个键(即dictTest[1][100][10]=10,并返回字典的两个值,因为两者的第一个键值均为1。

谢谢, 穆斯塔法。

4 个答案:

答案 0 :(得分:1)

dictTest={}
dictTest[1,100,10]=10
dictTest[1,101,11]=11
dictTest[2,102,11]=12

print([dictTest[i] for i in dictTest.keys() if i[0]==1])
print([dictTest[i] for i in dictTest if i[0]==1])            #more pythonic way

#creating a function instead of printing directly
def get_first(my_dict,val):
    return [my_dict[i] for i in my_dict if i[0]==val]

print(get_first(dictTest,1))

答案 1 :(得分:1)

字典的键是3个值的tuple。您可以根据元组的元素之一进行有效搜索,这不是“多键”命令。

您可以基于第一个键执行线性搜索,也可以仅使用第一个键创建另一个字典,如果重复访问,效率会更高。

由于重复键,因此需要一个列表作为值。例如,让该值成为包含键的其余部分和当前值的元组。像这样:

dictTest={}
dictTest[1,100,10]=10
dictTest[1,101,11]=11
dictTest[2,101,11]=30

import collections

newdict = collections.defaultdict(list)

for (newkey,v2,v3),value in dictTest.items():
    newdict[newkey].append(((v2,v3),value))

现在newdict[1][((101, 11), 11), ((100, 10), 10)](与该密钥匹配的所有值的列表,并加上-添加了原始密钥的其余部分,因此不会丢失任何数据)

以及整个字典:

>>> dict(newdict)
{1: [((101, 11), 11), ((100, 10), 10)], 2: [((101, 11), 30)]}

答案 2 :(得分:1)

要创建多层嵌套字典,可以使用递归创建的defaultdicts

from collections import defaultdict


def recursive_defaultdict():
    return defaultdict(recursive_defaultdict)

dictTest = recursive_defaultdict()
dictTest[1][100][10] = 10
dictTest[1][101][11] = 11

print(dictTest[1][100])

输出:

defaultdict(<function recursive_defaultdict at 0x1061fe848>, {10: 10})

答案 3 :(得分:1)

另一个实现的方法是:

Uri.encode(input, "utf-8")

输出为:

from collections import defaultdict

dictTest = defaultdict(lambda: defaultdict(dict))
dictTest[1][100][10] = 10
dictTest[1][101][11] = 11

print(dict(dictTest[1]))