2017-08-04 33 views
0

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

我宁愿解决方案是通用的第n项,虽然我的例子下面列出了两个级别。

如果你想象中的问题,如下图:

enter image description here

我试图从16-31获得所有值的列表。

例如, 我有一个i字典ij水龙头,我需要找出是否有任何水龙头上。

有没有一种方法来创建为我所有的抽头输出的列表只是通过使用搜索:

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'}} 
+0

将数据是什么样子了两个多层次的输入字典?也请更详细地描述你想要的输出格式。 – martineau

+0

我添加的图像有帮助吗? – azazelspeaks

+0

我不确定。中间级别的密钥会是什么样子(尽管我不确定它很重要)?我想要一些包含2个以上级别的示例数据来测试代码,以便改进我现有的答案。 – martineau

回答

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 
+2

你正在寻找M个房屋中的N个水龙头中的一个,所以你不能做任何比O(NxM)更好的事情。 – bfontaine

+0

您可以将字典更改为'{'on':{'house1':['t1'...],...},'off':{'house1':['t2'...], ...}以加快检查任何正在进行的检查,但这可能会减慢其他地方的速度 – dashiell

+0

是否有更通用的解决方案用于第n个项目? – azazelspeaks

2

检查:

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

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

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

您可以使用all()检查所有的水龙头上为好。

+0

嗯,我没有意识到任何(),但这肯定会比我的回答 – TallChuck

0

我不知道两个以上的“级别”会是什么样子,但它是为他们的1很简单:

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