我有一本字典,其中三个键分配给每个值: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。
谢谢, 穆斯塔法。
答案 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]))