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)