2017-02-22 24 views
1

Я хочу сделать «попутчика» резюме, которое выглядит как:магазин Различные типы значений в одном ключе - Словарь

Есть отправные точки для достижения Чикаго. Для получения доступа к этому , вы можете использовать: Highway X,Highway Z,Highway ZZ.

Данные, которые я в настоящее время выглядит примерно так:

шоссе X, Нью-Йорк, Чикаго

Highway Z, LA, Чикаго

шоссе X, Остин, Чикаго

Highway ZZ, Miami, Chicago

Мой вопрос: что я должен использовать для правильного хранения этих данных?

Я попытался использовать словарь со списком внутри него. Однако это не сработало, потому что я не смог сохранить список Highway. Я только удалось получить что-то вроде

{Чикаго: [Нью-Йорк, Лос-Анджелес, Остин]}

UPDATE !!

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

шоссе X, Нью-Йорк, Чикаго

шоссе X, Нью-Йорк, Чикаго

Highway Z, LA, Чикаго

шоссе X, Остин, Чикаго

шоссе ZZ, Майами, Чикаго

шоссе X, Нью-Йорк, Чикаго

+0

Так вы пытаетесь выяснить, лучший способ для хранения данных, так что для каждого города, вы можете увидеть, какие другие города вы можете пойти? – jlarks32

+0

@ jlarks32 Я пытаюсь найти способ хранения всех этих данных и распечатать их точно так же, как резюме. – ThomasWest

ответ

1

использовать список кортежей в словаре. Первым пунктом в каждом кортеже будет шоссе, второе - начальная точка.

routes = {'Chicago': [('Highway X', 'NY'), ('Highway Z', 'LA'), ('Highway AX', 'Austin'), ('Highway ZZ', 'Miami')]} 

Тогда это тривиальный для получения резюме:

for city in routes: 
    paths = ', '.join(sorted({route[0] for route in routes[city]})) 
    print("There are {} starting points to reach {}. To access this city, you can use: {}".format(len(routes[city]), city, paths)) 

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

 
There are 4 starting points to reach Chicago. To access this city, you can use: Highway X, Highway Z, Highway ZZ 

Простой способ построить routes Dict является использование collections.defaultdict списков. Если предположить, что ваши данные поступают из файла CSV:

import csv 
from collections import defaultdict 

routes = defaultdict(list) 

with open('data.csv') as f: 
    reader = csv.reader(f) 
    for highway, start, dest in reader: 
     routes[dest].append((highway, start)) 
+0

Спасибо, я пробовал это, и это сработало! Я хочу задать следующий вопрос. Можно ли сортировать города назначения на основе большинства отправных точек? Скажем, если мои данные - Чикаго = 4 стартовые точки, Сиэтл = 12 стартовых точек и SF = 2 стартовых точки. Затем мой код напечатает сначала Сиэтл, затем Чикаго и SF. – ThomasWest

+0

Привет, я только что обнаружил, что в моих данных есть дублирование. Есть ли способ устранить это дублирование, когда я добавляю? – ThomasWest

+0

Re duplicates :: yes, используйте набор кортежей (вместо списка) и измените 'routes [dest] .append()' to 'route [dest] .add()'. – mhawke

0

Гнездо некоторых словарей. Это позволяет вам следовать «маршруту».

{'Highway X': {'Austin': 'Chicago', 'NY': 'Chicago'}, 
'Highway Z': {'LA': 'Chicago'}, 
'Highway ZZ': {'Miami': 'Chicago'}} 

В качестве альтернативы:

{'Austin': {'Highway X': 'Chicago'}, 
'LA': {'Highway Z': 'Chicago'}, 
'Miami': {'Highway ZZ': 'Chicago'}, 
'NY': {'Highway X': 'Chicago'}} 
+0

Я попробую это первым. Благодаря! – ThomasWest

1

Лучший способ организации ваших данных зависит от того, что вы хотите сделать с ними.

Вы хотите ответить на такие вопросы, как «Я в Остине, какое шоссе мне нужно взять, чтобы добраться до Чикаго?"

Тогда ваши ключи должны быть отправления города:

lookup = {'Austin': 'Highway X', 
      'NY': 'Highway X', 
      'LA': 'Highway Z', 
      'Miami': 'Highway ZZ'} 

Потому что тогда вы можете ответить на этот вопрос, просто глядя отправную точку Аскера:

lookup['Austin'] 
# prints 
# Highway X 

Но если вы хотите, чтобы ответить разные вопросы, такие как «Кто-то, путешествующий по шоссе, в каком городе они чаще всего появляются?», тогда вы бы упорядочили свои данные по-разному.

Если вы jus т хочет напечатать их, используйте «Lil» (список списков)

table = [["Highway X", "NY", "Chicago"], 
     ["Highway Z", "LA", "Chicago"], 
     ["Highway X", "Austin", "Chicago"], 
     ["Highway ZZ", "Miami", "Chicago"]] 

Затем вы можете легко форматировать

for row in table: 
    print("{:12}{:8}{:10}".format(*row)) 
+0

Это действительно хорошая альтернатива. Благодаря! – ThomasWest