获取字典的所有第n级元素

时间:2017-08-04 16:21:36

标签: python

我正在尝试创建字典中所有第n级元素的列表。

我希望解决方案对于第n个项目是通用的,尽管下面的示例列出了两个级别。

如果您将问题想象如下图所示:

enter image description here

我正在尝试从16-31获取所有值的列表。

例如, 我有i随机生成的j水龙头的字典,我需要查看是否有任何水龙头。

有没有办法为我创建一个包含所有点击输出的列表,只需使用以下搜索:

for i in list_of_tap_outputs:
    new_list+=lambda x:x[2]

或其他什么或我是否必须让自己辞职使用列表。我还希望能够跟踪整个系统中的哪个水龙头。如果我使用了列表,我必须记住在列表中分配了哪个索引并且不想这样做。

data={'House'+str(i): {"Tap"+str(j): 'on' if random.randint(1,2)%2==1 else 'off'
                        for j in range(4)} for i in range(3)}

print data

输出如下:

{'House2': {'Tap1': 'off', 'Tap0': 'on', 'Tap3': 'off', 'Tap2': 'off'},
'House0': {'Tap1': 'off', 'Tap0': 'on', 'Tap3': 'on', 'Tap2': 'on'},
'House1': {'Tap1': 'off', 'Tap0': 'on', 'Tap3': 'off', 'Tap2': 'on'}}

4 个答案:

答案 0 :(得分:2)

def any_tap_on(data):
    for house, taps in data.items():
        for tap, status in taps.items():
            if status == 'on':
                return True
    return False

或者,使用in关键字可能会更快 - 就复杂程度而言,它是相同的,但内置操作往往运行得更快:

def any_tap_on(data):
    for house, taps in data.items():
        if 'on' in taps.values():
            return True
    return False

答案 1 :(得分:2)

检查是否有任何点按:

any('on' in taps.values() for taps in data.values())

检查任何房屋的特定水龙头:

any(taps['Tap0'] == 'on' for taps in data.values())

您也可以使用all()检查所有水龙头。

答案 2 :(得分:0)

我不确定超过两个"等级"看起来会像,但其中一个很简单:

from pprint import pprint
import random

data={'House'+str(i): {"Tap"+str(j): 'on' if random.randint(1,2)%2==1 else 'off'
                        for j in range(4)} for i in range(3)}

def get_nth_level_elements(d):
    results = []
    for key, value in d.items():
        results.append(value)
    return results

results = get_nth_level_elements(data)
pprint(results)

输出:

[{'Tap0': 'on', 'Tap1': 'off', 'Tap2': 'on', 'Tap3': 'off'},
 {'Tap0': 'on', 'Tap1': 'off', 'Tap2': 'on', 'Tap3': 'off'},
 {'Tap0': 'on', 'Tap1': 'on', 'Tap2': 'off', 'Tap3': 'on'}]

答案 3 :(得分:0)

所以,你似乎在这里提出两个问题,而不是专注于房子和水龙头的用例,在这个答案中,我将尝试解决一般情况。

我不是Python实现细节方面的专家,也不熟悉所有内置函数和标准库,但我认为生成像你所说的列表的唯一实用方法是使用递归函数。你似乎很像搜索树一样关注这个问题,如果你足够关心它,你可以找到很多阅读。

这是一个应该完成工作的示例函数。我没有进行过广泛的测试,但它至少适用于您提供的样本数据。

def extract_nth_level(root, n):
    if n == 0:
        return [root]
    values = []
    if isinstance(root, dict):
        for subtree in root.values():
            values += extract_nth_level(subtree, n-1)
    return values

data = {
    'House2': {'Tap1': 'off', 'Tap0': 'on', 'Tap3': 'off', 'Tap2': 'off'},
    'House0': {'Tap1': 'off', 'Tap0': 'on', 'Tap3': 'on', 'Tap2': 'on'},
    'House1': {'Tap1': 'off', 'Tap0': 'on', 'Tap3': 'off', 'Tap2': 'on'}
}

print extract_nth_level(data, 2)

这将打印以下列表:

['off', 'on', 'off', 'off', 'off', 'on', 'on', 'on', 'off', 'on', 'off', 'on']