【发布时间】:2016-06-10 08:22:59
【问题描述】:
我的代码有以下几行
get_alarm_list = conn.query_alarms(query.filter_expr,
query.orderb)
print "type is:", type(get_alarm_list)
for alarm in get_alarm_list:
if alarm.severity == 'critical':
alarm.severity = 2
elif alarm.severity == 'moderate':
alarm.severity = 1
else:
alarm.severity = 0
alarm_list = sorted(get_alarm_list),
key=lambda a: a.severity,
reverse=True)
return [alarms.Alarm.from_db_model(alarm)
for alarm in alarm_list]
输出:
type is <type 'generator'>
列表中的对象是:
for alarm in get_alarm_list:
print alarm
Output:
<aodh.storage.models.Alarm object at 0x7fa4c0cb1c50>
<aodh.storage.models.Alarm object at 0x7fa4c0cb17d0>
<aodh.storage.models.Alarm object at 0x7fa4c0d86f10>
<aodh.storage.models.Alarm object at 0x7fa4ca372110>
<aodh.storage.models.Alarm object at 0x7fa4ca372190>
<aodh.storage.models.Alarm object at 0x7fa4c0c55d90>
每个警报由以下数据组成
{'alarm_actions': [u'log://'], 'ok_actions': [], 'description': u'instance running hot', 'state': u'insufficient data', 'fields': ['alarm_actions', 'ok_actions', 'severity', 'timestamp', 'description', 'time_constraints', 'enabled', 'state_timestamp', 'rule', 'alarm_id', 'state', 'insufficient_data_actions', 'repeat_actions', 'user_id', 'project_id', 'type', 'name'], 'repeat_actions': False, 'enabled': True, 'state_timestamp': datetime.datetime(2016, 5, 27, 6, 41, 5, 987428), 'rule': {u'meter_name': u'cpu_util', u'evaluation_periods': 3, u'period': 600, u'statistic': u'avg', u'threshold': 70.0, u'query': [], u'comparison_operator': u'gt', u'exclude_outliers': False}, 'name': u'ddd', 'alarm_id': u'f5045ed5-5c53-4a6e-be53-23d3368f40c6', 'time_constraints': [], 'insufficient_data_actions': [], 'timestamp': datetime.datetime(2016, 5, 27, 6, 41, 5, 987428), 'user_id': u'9a65b258b5a24e74ac5feae2f6c54229', 'project_id': u'28d1c27e782c4448bf53da00f49d3e1b', 'type': u'threshold', 'severity': 2}
如何迭代生成器?
alarm_list = sorted(get_alarm_list,
key=lambda a: a.severity,
reverse=True)
但是这里alarm_list 是空的。我如何在生成器get_alarm_list上使用排序功能@
【问题讨论】:
-
sorted适用于生成器。它将返回一个排序列表。你能发布足够的代码来重现你的问题吗? -
@khelwood 我已经编辑了我的问题并发布了更多代码作为您的建议。
-
在第 2 版中,您可以使用
for index, value in enumerate(get_alarm_list)并将get_alarm_list更新为get_alarm_list[index],因此您无需创建单独的列表... -
问题是您首先迭代
get_alarm_list,因此消耗了该生成器,并且对sorted(get_alarm_list)的以下调用导致一个空列表,因为get_alarm_list没有更多元素。