2015-08-31 106 views
0

我有一个关于排序xml2dict结果的问题。 我有一个这样的XML:python筛选器和从xml2dict排序的排序列表

的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> 

中,我使用以下代码来导入到吡:

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 

我想对大家有帮助这个,因为我不知道多少on ordereddict behavior ...

+0

你能证明什么'layoutList'样子?你喜欢哪种类型的错误? –

+0

更新后,我希望你能找到它更有意义。 – user1811678

+0

layouList看起来像OrderDicts列表的列表,里面只有一个列表吗?你想让dict_filtered_layout_list成为orderedDicts的列表吗? –

回答

0

从更新layoutList看起来像OrderedDict列表的列表,所以当你直接尝试d 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) 
+0

谢谢,它的作品完美!感谢您的帮助阿南德 – user1811678

+0

嗨阿南德,额外的要求,当我有一个功能似乎不工作,我知道如何处理这个?谢谢。 – user1811678

+0

当你有一个'''layoutList'返回什么? –