从 python 中的复杂列表和字典中提取元素
Extract elements from complex list of lists and dictionaries in python
我有一个列表,其中包含许多代表纽约市地铁车厢的列表和字典:
[[{'arrival': {'time': 1506873749L},
'departure': {'time': 1506873749L},
'schedule_relationship': 0,
'stop_id': u'B20S'},
{'arrival': {'time': 1506873854L},
'departure': {'time': 1506873854L},
'schedule_relationship': 0,
'stop_id': u'B21S'},
{'arrival': {'time': 1506873989L},
'departure': {'time': 1506873989L},
'schedule_relationship': 0,
'stop_id': u'B22S'},
{'arrival': {'time': 1506874184L},
'departure': {'time': 1506874184L},
'schedule_relationship': 0,
'stop_id': u'B23S'},
{'arrival': {'time': 1506874469L},
'departure': {'time': 1506874469L},
'schedule_relationship': 0,
'stop_id': u'D43S'}],
[{'arrival': {'time': 1506873814L},
'departure': {'time': 1506873814L},
'schedule_relationship': 0,
'stop_id': u'D10N'},
{'arrival': {'time': 1506873877L},
'departure': {'time': 1506873877L},
'schedule_relationship': 0,
'stop_id': u'D09N'},
{'arrival': {'time': 1506873997L},
'departure': {'time': 1506873997L},
'schedule_relationship': 0,
'stop_id': u'D08N'},
{'arrival': {'time': 1506874087L},
'departure': {'time': 1506874087L},
'schedule_relationship': 0,
'stop_id': u'D07N'},
{'arrival': {'time': 1506874177L},
'departure': {'time': 1506874177L},
'schedule_relationship': 0,
'stop_id': u'D06N'},
{'arrival': {'time': 1506874267L},
'departure': {'time': 1506874267L},
'schedule_relationship': 0,
'stop_id': u'D05N'},
{'arrival': {'time': 1506874357L},
'departure': {'time': 1506874357L},
'schedule_relationship': 0,
'stop_id': u'D04N'},
{'arrival': {'time': 1506874477L},
'departure': {'time': 1506874477L},
'schedule_relationship': 0,
'stop_id': u'D03N'},
{'arrival': {'time': 1506874627L},
'departure': {'time': 1506874627L},
'schedule_relationship': 0,
'stop_id': u'D01N'}]]
我正在尝试识别与特定 stop_id 关联的条目。例如,如果我正在搜索 'D03N',我想 return 与之关联的整个条目:
{'arrival': {'time': 1506874477L},
'departure': {'time': 1506874477L},
'schedule_relationship': 0,
'stop_id': u'D03N'}
不幸的是,每当我尝试使用此答案中的建议时:Python list of dictionaries search
我最终收到 'TypeError: list indices must be integers, not str' 错误消息。我不确定这是因为我没有正确实施该解决方案,还是因为该列表与原始问题中的列表相比相对复杂,所以该解决方案不适用。
有没有办法从这个列表中提取特定条目?
你可以试试这个:
entry = 'D03N'
final_entries = [[b for b in i if b["stop_id"] == entry] for i in entry_data]
try:
new_final_entries = [i for i in final_entries if i][0][0]
except:
print("Entry not found")
其中条目数据是原始问题中发布的完整词典。
输出:
{'arrival': {'time': 1506874477L}, 'schedule_relationship': 0, 'departure': {'time': 1506874477L}, 'stop_id': u'D03N'}
l = <your list>
[ i for i in sum(l,[]) if i['stop_id'] == 'D03N' ]
或更有效的方式
from itertools import chain
[ i for i in chain.from_iterable(l) if i['stop_id'] == 'D03N' ]
>>> from itertools import chain
>>> data = [[{'arrival': {'time': 1506873749L}, 'departure': {'time': 1506873749L}, 'schedule_relationship': 0, 'stop_id': u'B20S'}, {'arrival': {'time': 1506873854L}, 'departure': {'time': 1506873854L}, 'schedule_relationship': 0, 'stop_id': u'B21S'}, {'arrival': {'time': 1506873989L}, 'departure': {'time': 1506873989L}, 'schedule_relationship': 0, 'stop_id': u'B22S'}, {'arrival': {'time': 1506874184L}, 'departure': {'time': 1506874184L}, 'schedule_relationship': 0, 'stop_id': u'B23S'}, {'arrival': {'time': 1506874469L}, 'departure': {'time': 1506874469L}, 'schedule_relationship': 0, 'stop_id': u'D43S'}], [{'arrival': {'time': 1506873814L}, 'departure': {'time': 1506873814L}, 'schedule_relationship': 0, 'stop_id': u'D10N'}, {'arrival': {'time': 1506873877L}, 'departure': {'time': 1506873877L}, 'schedule_relationship': 0, 'stop_id': u'D09N'}, {'arrival': {'time': 1506873997L}, 'departure': {'time': 1506873997L}, 'schedule_relationship': 0, 'stop_id': u'D08N'}, {'arrival': {'time': 1506874087L}, 'departure': {'time': 1506874087L}, 'schedule_relationship': 0, 'stop_id': u'D07N'}, {'arrival': {'time': 1506874177L}, 'departure': {'time': 1506874177L}, 'schedule_relationship': 0, 'stop_id': u'D06N'}, {'arrival': {'time': 1506874267L}, 'departure': {'time': 1506874267L}, 'schedule_relationship': 0, 'stop_id': u'D05N'}, {'arrival': {'time': 1506874357L}, 'departure': {'time': 1506874357L}, 'schedule_relationship': 0, 'stop_id': u'D04N'}, {'arrival': {'time': 1506874477L}, 'departure': {'time': 1506874477L}, 'schedule_relationship': 0, 'stop_id': u'D03N'}, {'arrival': {'time': 1506874627L}, 'departure': {'time': 1506874627L}, 'schedule_relationship': 0, 'stop_id': u'D01N'}]]
>>> def find(s):
found = [x for x in chain(*data) if x['stop_id']==s]
return found[0] if found else None
>>> find(u'D03N')
{'arrival': {'time': 1506874477L}, 'schedule_relationship': 0, 'departure': {'time': 1506874477L}, 'stop_id': u'D03N'}
这是一个适用于任何级别的嵌套列表的递归解决方案。
此函数搜索 (DFS) 列表就像它是一个图表,其中您的列表是根节点,子列表是父节点,字典是叶节点。
def find_by_stopid(at, target, saveto):
if isinstance(at, dict):
if at['stop_id'] == target:
saveto.append(at)
return
for x in at:
find_by_stopid(x, target, saveto)
found = []
target = u'D03N'
# data is the list you have, targets is the string to match
# and found is where matches are saved
find_by_stopid(data, target, found)
print(found)
我有一个列表,其中包含许多代表纽约市地铁车厢的列表和字典:
[[{'arrival': {'time': 1506873749L},
'departure': {'time': 1506873749L},
'schedule_relationship': 0,
'stop_id': u'B20S'},
{'arrival': {'time': 1506873854L},
'departure': {'time': 1506873854L},
'schedule_relationship': 0,
'stop_id': u'B21S'},
{'arrival': {'time': 1506873989L},
'departure': {'time': 1506873989L},
'schedule_relationship': 0,
'stop_id': u'B22S'},
{'arrival': {'time': 1506874184L},
'departure': {'time': 1506874184L},
'schedule_relationship': 0,
'stop_id': u'B23S'},
{'arrival': {'time': 1506874469L},
'departure': {'time': 1506874469L},
'schedule_relationship': 0,
'stop_id': u'D43S'}],
[{'arrival': {'time': 1506873814L},
'departure': {'time': 1506873814L},
'schedule_relationship': 0,
'stop_id': u'D10N'},
{'arrival': {'time': 1506873877L},
'departure': {'time': 1506873877L},
'schedule_relationship': 0,
'stop_id': u'D09N'},
{'arrival': {'time': 1506873997L},
'departure': {'time': 1506873997L},
'schedule_relationship': 0,
'stop_id': u'D08N'},
{'arrival': {'time': 1506874087L},
'departure': {'time': 1506874087L},
'schedule_relationship': 0,
'stop_id': u'D07N'},
{'arrival': {'time': 1506874177L},
'departure': {'time': 1506874177L},
'schedule_relationship': 0,
'stop_id': u'D06N'},
{'arrival': {'time': 1506874267L},
'departure': {'time': 1506874267L},
'schedule_relationship': 0,
'stop_id': u'D05N'},
{'arrival': {'time': 1506874357L},
'departure': {'time': 1506874357L},
'schedule_relationship': 0,
'stop_id': u'D04N'},
{'arrival': {'time': 1506874477L},
'departure': {'time': 1506874477L},
'schedule_relationship': 0,
'stop_id': u'D03N'},
{'arrival': {'time': 1506874627L},
'departure': {'time': 1506874627L},
'schedule_relationship': 0,
'stop_id': u'D01N'}]]
我正在尝试识别与特定 stop_id 关联的条目。例如,如果我正在搜索 'D03N',我想 return 与之关联的整个条目:
{'arrival': {'time': 1506874477L},
'departure': {'time': 1506874477L},
'schedule_relationship': 0,
'stop_id': u'D03N'}
不幸的是,每当我尝试使用此答案中的建议时:Python list of dictionaries search 我最终收到 'TypeError: list indices must be integers, not str' 错误消息。我不确定这是因为我没有正确实施该解决方案,还是因为该列表与原始问题中的列表相比相对复杂,所以该解决方案不适用。
有没有办法从这个列表中提取特定条目?
你可以试试这个:
entry = 'D03N'
final_entries = [[b for b in i if b["stop_id"] == entry] for i in entry_data]
try:
new_final_entries = [i for i in final_entries if i][0][0]
except:
print("Entry not found")
其中条目数据是原始问题中发布的完整词典。
输出:
{'arrival': {'time': 1506874477L}, 'schedule_relationship': 0, 'departure': {'time': 1506874477L}, 'stop_id': u'D03N'}
l = <your list>
[ i for i in sum(l,[]) if i['stop_id'] == 'D03N' ]
或更有效的方式
from itertools import chain
[ i for i in chain.from_iterable(l) if i['stop_id'] == 'D03N' ]
>>> from itertools import chain
>>> data = [[{'arrival': {'time': 1506873749L}, 'departure': {'time': 1506873749L}, 'schedule_relationship': 0, 'stop_id': u'B20S'}, {'arrival': {'time': 1506873854L}, 'departure': {'time': 1506873854L}, 'schedule_relationship': 0, 'stop_id': u'B21S'}, {'arrival': {'time': 1506873989L}, 'departure': {'time': 1506873989L}, 'schedule_relationship': 0, 'stop_id': u'B22S'}, {'arrival': {'time': 1506874184L}, 'departure': {'time': 1506874184L}, 'schedule_relationship': 0, 'stop_id': u'B23S'}, {'arrival': {'time': 1506874469L}, 'departure': {'time': 1506874469L}, 'schedule_relationship': 0, 'stop_id': u'D43S'}], [{'arrival': {'time': 1506873814L}, 'departure': {'time': 1506873814L}, 'schedule_relationship': 0, 'stop_id': u'D10N'}, {'arrival': {'time': 1506873877L}, 'departure': {'time': 1506873877L}, 'schedule_relationship': 0, 'stop_id': u'D09N'}, {'arrival': {'time': 1506873997L}, 'departure': {'time': 1506873997L}, 'schedule_relationship': 0, 'stop_id': u'D08N'}, {'arrival': {'time': 1506874087L}, 'departure': {'time': 1506874087L}, 'schedule_relationship': 0, 'stop_id': u'D07N'}, {'arrival': {'time': 1506874177L}, 'departure': {'time': 1506874177L}, 'schedule_relationship': 0, 'stop_id': u'D06N'}, {'arrival': {'time': 1506874267L}, 'departure': {'time': 1506874267L}, 'schedule_relationship': 0, 'stop_id': u'D05N'}, {'arrival': {'time': 1506874357L}, 'departure': {'time': 1506874357L}, 'schedule_relationship': 0, 'stop_id': u'D04N'}, {'arrival': {'time': 1506874477L}, 'departure': {'time': 1506874477L}, 'schedule_relationship': 0, 'stop_id': u'D03N'}, {'arrival': {'time': 1506874627L}, 'departure': {'time': 1506874627L}, 'schedule_relationship': 0, 'stop_id': u'D01N'}]]
>>> def find(s):
found = [x for x in chain(*data) if x['stop_id']==s]
return found[0] if found else None
>>> find(u'D03N')
{'arrival': {'time': 1506874477L}, 'schedule_relationship': 0, 'departure': {'time': 1506874477L}, 'stop_id': u'D03N'}
这是一个适用于任何级别的嵌套列表的递归解决方案。 此函数搜索 (DFS) 列表就像它是一个图表,其中您的列表是根节点,子列表是父节点,字典是叶节点。
def find_by_stopid(at, target, saveto):
if isinstance(at, dict):
if at['stop_id'] == target:
saveto.append(at)
return
for x in at:
find_by_stopid(x, target, saveto)
found = []
target = u'D03N'
# data is the list you have, targets is the string to match
# and found is where matches are saved
find_by_stopid(data, target, found)
print(found)