从不同的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.它能更好地反映数据吗?在这里,您只有一个行程路线组合。我可以尝试,但我在结果部分显示,每个
站点
可以有多个与其相关的行程
(但每个行程
只有一个路线
)。