基于一个键查找多键词典的所有键

2024-06-02 14:53:26 发布

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

我有一个字典,每个值有3个键:dictTest[c,pH,T] = value。我想检索与给定的单个键对应的所有值:dictTest[c,*,*] = value(s)

我在网上查了一下,但找不到Python的任何解决方案,只有C#。我试过使用dictTest[c,*,*],但出现语法错误。我看到的另一个选项是使用多级键,即第一级为c,第二级为pH,依此类推,即dictTest[c][pH][T] = value(从http://python.omics.wiki/data-structures/dictionary/multiple-keys

下面是一些测试代码:

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

下面给出了一个语法错误:

print(dictTest[1,*,*])

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

print(dictTest[1])

我也尝试过上面提到的多级键,但在尝试定义字典时会出现语法错误:

dictTest[1][100][10]=10

在上面的示例中,我只想指定第一个键(即key1=1),并返回字典的两个值,因为这两个值的第一个键值都是1。你知道吗

谢谢你, 穆斯塔法。你知道吗


Tags: httpdatadictionary字典value选项wiki解决方案
3条回答

要创建多级嵌套字典,可以使用递归创建的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个值的tuple。它不是一个“多键”dict,您可以根据元组的某个元素高效地搜索它。你知道吗

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

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

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)]}
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))

相关问题 更多 >