我有一个编码递归问题,在这里我试图编写一个递归函数,在这种情况下,该函数仅返回PscPowerCableConnected
。如果有人有更干净的工作代码,请与我分享。
python3代码
def find_intresting_events(processed_events):
INTERESTED_EVENTS = [
'PscPowerCableDisconnected',
'PscPowerCableConnected'
]
for event in INTERESTED_EVENTS:
if type(processed_events) == list:
find_intresting_events(processed_events[0])
else:
print(processed_events)
if processed_events.get(event):
return event
else:
find_intresting_events(processed_events.values())
return None
输入
path = [{'allEvents': [{'type': 'error_recovered', 'data': [{'error_name': 'Power cable connection', 'PscPowerCableConnected': {'error_name': 'Power cable connection', 'steps': {}}}]}], 'id': '5d154ec80df300000006', 'timestamp': 1561677512101, 'ms_since_boot': 10821695}]
错误
>>> find_intresting_events(path)
{'allEvents': [{'type': 'error_recovered', 'data': [{'error_name': 'Power cable connection', 'PscPowerCableConnected': {'error_name': 'Power cable connection', 'steps': {}}}]}], 'id': '5d154ec80df300000006', 'timestamp': 1561677512101, 'ms_since_boot': 10821695}
dict_values([[{'type': 'error_recovered', 'data': [{'error_name': 'Power cable connection', 'PscPowerCableConnected': {'error_name': 'Power cable connection', 'steps': {}}}]}], '5d154ec80df300000006', 1561677512101, 10821695])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in find_intresting_events
File "<stdin>", line 14, in find_intresting_events
File "<stdin>", line 11, in find_intresting_events
AttributeError: 'dict_values' object has no attribute 'get'
答案 0 :(得分:1)
之所以发生这种情况是因为您尝试在字符串上使用 .get ,因此if statement
仅检查您的数据类型是否为列表,您for loop
中的 event 变量是字符串,因此,选中if statement
后,它会转到else
并尝试对字符串使用get
方法。
如果仅将print(type(event))
放入循环的第一行,就会注意到问题。
def find_intresting_events(processed_events):
INTERESTED_EVENTS = [
'PscPowerCableDisconnected',
'PscPowerCableConnected'
]
for event in INTERESTED_EVENTS:
if type(processed_events) == list:
find_intresting_events(processed_events[0])
else:
print(type(event))
return None
find_intresting_events(path)
输出为:
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
如果您需要其他帮助,我们将很乐意为您提供帮助。
答案 1 :(得分:0)
我能够提出一个解决方案,但是看起来很难看。我敢肯定,如果您能想到一种更好的方法,可以有更好的方法来实现,请与我分享。
def find_intresting_events(processed_events):
INTERESTED_EVENTS = [
'PscPowerCableDisconnected',
'PscPowerCableConnected'
]
for event in INTERESTED_EVENTS:
if type(processed_events) == list:
return find_intresting_events(processed_events[0])
elif type(processed_events) == dict:
for k,v in processed_events.items():
if type(v) == list:
return find_intresting_events(v[0])
if processed_events.get(event):
return event
return