Создание многоуровневого словаря из разных наборов dict и key / value - python - PullRequest
0 голосов
/ 05 ноября 2019

Контекст: Я сгенерировал график networkx с различными остановками транспорта. Единственные атрибуты, которые имеет каждая остановочная станция, это их позиции id, name, lon и lat.

Я хочу добавить другие атрибуты к каждой точке, эти атрибуты находятся в 3 файлах CSV. который я открыл как dicts: (я значительно упростил их для облегчения чтения):

stops_csv = DictReader(open(STOPS_FILE,'r'))
Dict2 = dict()
for stop in stops_csv:
    Dict2[stop['stop_id']] = stop


Dict2:   ### Dict gotten from the nx graph.
{'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:   ### Dict that links Dict2 and Dict3.
{'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 containing trip_id and route_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() позже.

Для каждого stop_id Dict2 я хотел бы добавить каждый trip_id соответствующий, который находится в Dict3. И затем, для каждого trip_id ранее добавленного, я хотел бы добавить каждый route_id соответствующий, который также находится в Dict3.

Мои проблемы следующие:

  • Я не могу накапливать значения с одинаковым ключом вместо их замены. Я попробовал то, что было предложено в этом посте , но не смог заставить его работать. Поэтому я попробовал другой подход, и ниже это то, что я сделал до сих пор. По сути, для каждого stop_id есть один или несколько trip_id, соответствующих, однако я получаю только самое последнее trip_id значение.
test_dict = dict()

for s in Dict2: # 's' stands for stop.
    test_dict['{}'.format(s)] = {}
    for t in Dict3: # 't' stands for trip.
        test_dict['{}'.format(s)]['trip_id'] = t
print(test_dict)

>>> {'stop1': {'trip_id': 'tripn'},  #'tripn' corresponds to the last trip_id value.
 'stop2': {'trip_id': 'tripn'},
 'stop3': {'trip_id': 'tripn'},
 'stop4': {'trip_id': 'tripn'},
 'stop5': {'trip_id': 'tripn'}, ...}
  • Кроме того, один изСамая большая проблема, с которой я столкнулся, это route_id - не ключ, а значение Dict3, и я понятия не имею, как мне поступить. Так что любые указания здесь будут очень полезны ...

Результат должен выглядеть следующим образом:


{stop1
     trip1
          route1
     trip2
          route1

stop2
     trip3
          route1
     trip4
          route1
     trip5
          route2
...}

Я знаю, что не логично иметь trip_id до route_id, но я не буду работать с ним так же, как trip_id, поэтому этот результат должен облегчить мою будущую работу в теории.

Я просмотрел много постов о создании вложенных словарей с pythonи особенно этот , который входит в многоуровневую диктовку, но я все еще не мог найти решение своей проблемы, поэтому я здесь.

Я всегда мог открыть 3 csvкак dataframes, merge их, а затем сделать из них желаемое dict, но я тоже не знаю, как это сделать.

1 Ответ

0 голосов
/ 07 ноября 2019

Я не уверен, хотите ли вы объединить всю информацию из словарей или только названия остановок-маршрутов, как вы указали. Для последнего, вот некоторый простой код, который создает словарь со структурой

  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_id имеет более одного trip_id, new_dictбудет выглядеть так:

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

Вы можете убедиться в этом, используя ключи:

new_dict['stop_01'].keys()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...