在python中从复杂的列表和字典列表中提取元素

在python中从复杂的列表和字典列表中提取元素,python,list,dictionary,nested-lists,Python,List,Dictionary,Nested Lists,我有一个列表,其中列出了许多代表纽约地铁车辆的列表和字典: [[{'arrival': {'time': 1506873749L}, 'departure': {'time': 1506873749L}, 'schedule_relationship': 0, 'stop_id': u'B20S'}, {'arrival': {'time': 1506873854L}, 'departure': {'time': 1506873854L}, 'schedule_

我有一个列表,其中列出了许多代表纽约地铁车辆的列表和字典:

[[{'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”,我希望返回与其关联的整个条目:

 {'arrival': {'time': 1506874477L},
       'departure': {'time': 1506874477L},
       'schedule_relationship': 0,
       'stop_id': u'D03N'}
不幸的是,每当我尝试使用这个答案中的建议时: 我最后得到一条“TypeError:list索引必须是整数,而不是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'}

这是一个递归解决方案,可用于任何级别的嵌套列表。 此函数将搜索(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)

看起来你只是多了一层嵌套(我想你只是故意向我们展示了外部列表中的一个元素)。在这种情况下,除了处理嵌套外,您可以使用与链接副本相同的答案,即
(item for nested In outer for item In nested if item['stop_id']=='D03N')。next()
我不是下一个投票人。但我认为OP想要的只是字典。i、 e.
新的\u最终\u条目[0][0]
在您的解决方案中。@mshsayem感谢您指出这一点。请查看我最近的编辑。现在如果搜索到不存在的
条目
,它将引发异常。
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'}
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)