python 从 xml2dict 过滤和排序 orderedict 列表
python filter and sort list of orderedict from xml2dict
我对排序 xml2dict 结果有疑问。
我有一个 xml 这样的:
Python 2.7
<schedule>
<layout file="12" fromdt="2015-07-25 00:42:35" todt="2015-09-02 02:54:14" scheduleid="34" priority="0" dependents="30.jpg,38.mp4,39.mp4"/>
<layout file="10" fromdt="2015-08-25 00:42:32" todt="2015-09-02 02:54:03" scheduleid="34" priority="1" dependents="30.jpg,38.mp4,39.mp4"/>
</schedule>
其中我使用以下代码导入 py:
dict_schedule_xml = xmlFileToDict(filename)
layoutList.append(dict_schedule_xml['schedule']['layout'])
layoutList 如下所示:
[[OrderedDict([(u'@file', u'12'), (u'@fromdt', u'2015-07-24 00:42:35'), (u'@todt', u'2015-09-02 02:54:14'), (u'@scheduleid', u'34'), (u'@priority', u'0'), (u'@dependents', u'30.jpg,38.mp4,39.mp4')]), OrderedDict([(u'@file', u'10'), (u'@fromdt', u'2015-08-25 00:42:32'), (u'@todt', u'2015-09-02 02:54:03'), (u'@scheduleid', u'34'), (u'@priority', u'1'), (u'@dependents', u'30.jpg,38.mp4,39.mp4')])]]
我想过滤掉一些不需要的条目,如下执行:
dict_filtered_layout_list = [s for s in layoutList if (onAirSchedule(s['@fromdt'],s['@todt']))]
dict_filtered_layout_list = sorted(dict_filtered_layout_list, key=lambda k: k['@priority'], reverse = True)
使用以下自定义函数:
def onAirSchedule(fromdt, todt):
dt_now = datetime.now()
fromdt = datetime.strptime(fromdt,'%Y-%m-%d %H:%M:%S')
todt = datetime.strptime(todt,'%Y-%m-%d %H:%M:%S')
return (fromdt < dt_now < todt)
我每次收到错误都想知道
File "xibo_reader.py", line 91, in on_modified
dict_filtered_layout_list = [s for s in layoutList if (onAirSchedule(s['@fromdt'],s['@todt']))]
TypeError: list indices must be integers, not str
我想在这方面得到帮助,因为我对 ordereddict 行为知之甚少...
从更新来看 layoutList
看起来像 OrderedDict 列表的列表,因此当您直接尝试执行 for s in layoutList if (onAirSchedule(s['@fromdt']
时,会导致错误,因为无法使用字符串访问列表,只能使用整数索引。
如果您希望 dict_filtered_layout_list
成为具有过滤值的单个 OrderedDict 列表,那么您可以遍历 layoutList
中的列表列表以创建该单个列表。
例子-
dict_filtered_layout_list = [s for list_orderedDict in layoutList for s in list_orderedDict if (onAirSchedule(s['@fromdt'],s['@todt']))]
dict_filtered_layout_list = sorted(dict_filtered_layout_list, key=lambda k: k['@priority'], reverse = True)
我对排序 xml2dict 结果有疑问。 我有一个 xml 这样的:
Python 2.7
<schedule>
<layout file="12" fromdt="2015-07-25 00:42:35" todt="2015-09-02 02:54:14" scheduleid="34" priority="0" dependents="30.jpg,38.mp4,39.mp4"/>
<layout file="10" fromdt="2015-08-25 00:42:32" todt="2015-09-02 02:54:03" scheduleid="34" priority="1" dependents="30.jpg,38.mp4,39.mp4"/>
</schedule>
其中我使用以下代码导入 py:
dict_schedule_xml = xmlFileToDict(filename)
layoutList.append(dict_schedule_xml['schedule']['layout'])
layoutList 如下所示:
[[OrderedDict([(u'@file', u'12'), (u'@fromdt', u'2015-07-24 00:42:35'), (u'@todt', u'2015-09-02 02:54:14'), (u'@scheduleid', u'34'), (u'@priority', u'0'), (u'@dependents', u'30.jpg,38.mp4,39.mp4')]), OrderedDict([(u'@file', u'10'), (u'@fromdt', u'2015-08-25 00:42:32'), (u'@todt', u'2015-09-02 02:54:03'), (u'@scheduleid', u'34'), (u'@priority', u'1'), (u'@dependents', u'30.jpg,38.mp4,39.mp4')])]]
我想过滤掉一些不需要的条目,如下执行:
dict_filtered_layout_list = [s for s in layoutList if (onAirSchedule(s['@fromdt'],s['@todt']))]
dict_filtered_layout_list = sorted(dict_filtered_layout_list, key=lambda k: k['@priority'], reverse = True)
使用以下自定义函数:
def onAirSchedule(fromdt, todt):
dt_now = datetime.now()
fromdt = datetime.strptime(fromdt,'%Y-%m-%d %H:%M:%S')
todt = datetime.strptime(todt,'%Y-%m-%d %H:%M:%S')
return (fromdt < dt_now < todt)
我每次收到错误都想知道
File "xibo_reader.py", line 91, in on_modified
dict_filtered_layout_list = [s for s in layoutList if (onAirSchedule(s['@fromdt'],s['@todt']))]
TypeError: list indices must be integers, not str
我想在这方面得到帮助,因为我对 ordereddict 行为知之甚少...
从更新来看 layoutList
看起来像 OrderedDict 列表的列表,因此当您直接尝试执行 for s in layoutList if (onAirSchedule(s['@fromdt']
时,会导致错误,因为无法使用字符串访问列表,只能使用整数索引。
如果您希望 dict_filtered_layout_list
成为具有过滤值的单个 OrderedDict 列表,那么您可以遍历 layoutList
中的列表列表以创建该单个列表。
例子-
dict_filtered_layout_list = [s for list_orderedDict in layoutList for s in list_orderedDict if (onAirSchedule(s['@fromdt'],s['@todt']))]
dict_filtered_layout_list = sorted(dict_filtered_layout_list, key=lambda k: k['@priority'], reverse = True)