从不同的dict和键/值集创建多级字典-python

从不同的dict和键/值集创建多级字典-python,python,dataframe,dictionary,networkx,Python,Dataframe,Dictionary,Networkx,上下文:我生成了一个带有不同运输站点的networkx图。每个停车站的唯一属性是其id、name、lon和lat位置 我想为每个点添加其他属性,这些属性在我打开的3个csv文件中找到,作为dicts:(为了便于阅读,我对它们进行了大量简化): stops\u csv=DictReader(打开(stops\u文件,'r')) Dict2=dict() 对于停靠站_csv: Dict2[stop['stop\u id']=stop Dict2:####Dict从nx图中获取。 {'stop1':O

上下文:我生成了一个带有不同运输站点的
networkx
图。每个停车站的唯一属性是其
id
name
lon
lat
位置

我想为每个点添加其他属性,这些属性在我打开的3个csv文件中找到,作为
dicts
:(为了便于阅读,我对它们进行了大量简化):

stops\u csv=DictReader(打开(stops\u文件,'r'))
Dict2=dict()
对于停靠站_csv:
Dict2[stop['stop\u id']=stop
Dict2:####Dict从nx图中获取。
{'stop1':OrderedDict([('stop_id','stop1'),
('stop_name','name1'),
(‘lat’、‘lat1’),
('lon','lon1')),
'stop2':OrderedDict([('stop_id','stop2'),
('stop_name','name2'),
(‘lat’、‘lat2’),
('lon','lon2')),…}
Dict1:####连接Dict2和Dict3的Dict1。
{'stop1':OrderedDict([('trip_id','trip1'),
('t1','01:43:00'),
('t2','01:43:00')),
'stop2':OrderedDict([('trip_id','trip2'),
('t1','18:14:00'),
('t2','18:14:00')),…]
Dict3:####Dict包含行程id和路线id。
{'trip1':OrderedDict([('route_id','route1'),
('trip_id','trip1'),
('direction_id','0')),
“trip2”:OrderedDict([('route_id','route2'),
('trip_id','trip2'),
('direction_id','0')),…}
我想将
Dict1
Dict2
Dict3
链接到一个多级
dict
,我计划在
nx.set_node_attributes()
中使用

对于
Dict2
的每个停车id,我想添加
Dict3
中对应的每个
trip id
。然后,对于前面添加的每个
trip\u id
,我想添加每个
route\u id
对应的
Dict3

我的问题如下:

  • 我似乎无法累积具有相同键的值,而不是替换它们。 我尝试了提议的职位,但似乎没有成功。所以我尝试了另一种方法,下面就是我目前所做的。基本上,对于每个
    stop\u id
    都有一个或多个
    trip\u id
    对应,但是,我只得到最后一个
    trip\u id
test\u dict=dict()
对于第2条中的s:#“s”代表停止。
测试记录['{}'。格式]={}
对于第3条中的t:#“t”代表trip。
测试指令['{}.格式]['trip\u id']=t
打印(测试记录)
>>>{'stop1':{'trip_id':'tripn'},#'tripn'对应于最后一个trip_id值。
'stop2':{'trip_id':'tripn'},
'stop3':{'trip_id':'tripn'},
'stop4':{'trip_id':'tripn'},
'stop5':{'trip_id':'tripn'},…}
  • 另外,我遇到的最大问题之一是
    route\u id
    不是一个键,而是
    Dict3
    的值,我不知道该怎么做。因此,任何迹象都将不胜感激

结果应该是这样的:

new_dict = {
       'stop_01': {
            'trip1': 'route1',
            'trip2': 'route2' 
                  }
            }

{stop1
trip1
路线1
trip2
路线1
停止2
trip3
路线1
trip4
路线1
trip5
路线2
...}
我知道在
route\u id
之前使用
trip\u id
似乎不符合逻辑,但我不会像
trip\u id
那样使用它,因此这一结果应该会让我未来的工作在理论上更容易

我看过很多关于用python创建嵌套字典的文章,特别是涉及到多层次dict的文章,但我仍然找不到解决问题的方法,所以我来了


我总是可以将3个
csv
作为
dataframes
merge
打开,然后从中提取所需的
dict
,但我也不知道该怎么做。

我不确定您是想合并字典中的所有信息,还是只合并您指定的停站路线名称。对于后者,下面是一些简单的代码,用于创建具有

  stop
    trip
      route
结构:

# initialise new dictionary
new_dict = {}

for stop in Dict2.keys():

    # access the "connection dict" and get the trip_id
    trip_ids = Dict1.get(stop).get('trip_id')

    # initialise trip dict
    trip_dict = {}

    # if there is only one trip_id, create a list with a single entry
    if not isinstance(trip_ids, list):
        trip_ids = [trip_ids]

    for trip_id in trip_ids:

        # using trip id, get route info:
        route_id = Dict3.get(trip_id).get('route_id')

        # combine information
        trip_dict[trip_id] = route_id

    new_dict[stop] = trip_dict
如果给定的
stop\u id
有多个
trip\u id
,则新的dict将如下所示:

new_dict = {
       'stop_01': {
            'trip1': 'route1',
            'trip2': 'route2' 
                  }
            }
您可以通过访问密钥来验证这一点:

new_dict['stop_01'].keys()

感谢您的回答,理想情况下,我希望合并所有信息,但我将从“停站路线”组合开始,从这里开始工作。您发布的内容只为每个站点id提供了一个trip\u id-route\u id组合,但当一个站点id有多个trip\u id时,我如何列出所有trip\u is-route\u id?(几乎总是这样)你能更新问题s.t.它能更好地反映数据吗?在这里,您只有一个行程路线组合。我可以尝试,但我在结果部分显示,每个
站点
可以有多个与其相关的
行程
(但每个
行程
只有一个
路线
)。