我正在尝试创建字典中所有第n级元素的列表。
我希望解决方案对于第n个项目是通用的,尽管下面的示例列出了两个级别。
如果您将问题想象如下图所示:
我正在尝试从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'}}
答案 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']