Pythonic查找与嵌套字典

时间:2017-06-19 07:17:20

标签: python python-3.x dictionary

我有一个字典,其中每个键都有一个字典作为其值(嵌套字典都有相同的键集)。我试图找到与子键上的两个条件相关联的键:给定另一个子键的子键的最大值为True。

例如:

d = {'key1' : {'subkey1' : True,  'subkey2' : 4},
     'key2' : {'subkey1' : True,  'subkey2' : 8},
     'key3' : {'subkey1' : False, 'subkey2' : 1},
     'key4' : {'subkey1' : False, 'subkey2' : 9} }

我希望结果是' key2'因为它是' subkey2'的最大值。其中' subkey1'是真的。

我的诱惑是将所有内容放入数组并查找与这些值相关联的索引,但我的印象是,无需添加更多变量来存储相同的信息即可完成此操作。我认为可能有更好的方法,因为我对Python比较新。

有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:1)

这是您的问题的可选实施。

首先,使用True过滤所有subkey1。

其次,从过滤字典中查找subkey2中的最大值。

cluster {
  seed-nodes = [
    "akka.tcp://automation-akka-http@${?HOST1}:2555",
    "akka.tcp://automation-akka-http@${?HOST2}:2555"
  ] // Seed nodes of the cluster
  auto-down-unreachable-after = 10s
}

答案 1 :(得分:1)

这有点令人费解但是这个怎么样:

print(d[max({key:d[key] for key in [k for k in d.keys() if d[k]['subkey1'] is True]})])

首先我们创建一个主键的列表,其中subkey1为True,然后为每个主键重建一个键值对的字典,我们采用最大值的键

Haven没有对此进行全面测试,所以如果您觉得值得花时间,请在最后做。

答案 2 :(得分:1)

您可能需要reduce

functools

以下是您可能正在寻找的解决方案:

from functools import reduce
import operator

d = {'key1' : {'subkey1' : True,  'subkey2' : 4},
     'key2' : {'subkey1' : True,  'subkey2' : 8},
     'key3' : {'subkey1' : False, 'subkey2' : 1},
     'key4' : {'subkey1' : False, 'subkey2' : 9} }
maxsum=0
for k in d:
    if reduce(operator.getitem, [k,'subkey1'], d):
        value = (reduce(operator.getitem, [k,'subkey2'], d))
        if maxsum<value:
            maxsum=value
print(maxsum)

基本上这个reduce(operator.getitem, [k,'subkey1'], d)所做的是从子字典中获取值。例如:

d = {'John' : {'Male' : True,  'age' : 41}}
reduce(operator.getitem, ['John','Male'], d)

输出:

True

这里通过John减少遍历 - >男性,并将结果作为True

我们也可以将列表作为参数。看看这个,

from functools import reduce
import operator

d = {'John' : {'Male' : True,  'age' : 41},
         'Vishnu':{'Male':True ,'age':23}}
chklist1 = ['John','Male']
chklist2 = ['Vishnu','age']
print(reduce(operator.getitem, chklist1, d))
print(reduce(operator.getitem, chklist2, d))

输出:

True
23

你不能总是期望这个词典是dict的词典。它可以说是一个dict dict dict的字典。 (谁知道?事情发生了!)

from functools import reduce
import operator

d = {
    "John":{
        "Age": 23,
        "Sex": 'M',
        "Country": 'USA'
        },
    "Vishnu":{
        "Age": 1,
        "Country": {
            "India": 'TamilNadu',
            "USA": None,
            "South Africa": None
        }
        }
}
chklist1 = ['John','Age']
chklist2 = ['Vishnu','Country','India']
print(reduce(operator.getitem, chklist1, d))
print(reduce(operator.getitem, chklist2, d))

输出:

23
TamilNadu

现在回到你的问题:

for k in d:
    if reduce(operator.getitem, [k,'subkey1'], d):
        value = (reduce(operator.getitem, [k,'subkey2'], d))
        if maxsum<value:
            maxsum=value
print(maxsum)

对于您的k等每个键key1,key2,...。首先reduce(operator.getitem, [k,'subkey1'], d)检查其中包含的值是True还是False。只有在True

时才会进行

然后将maxsum设置为dict的sub_dict中的第二项。检查每个键,如果找到另一个大于当前值的值,则更改该值,否则继续。直到找到可以打印出的最大值。