2016-09-01 2 views
0

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

cities = ['newyork','london','tokyo','paris'] 
citypairs = [i for i in it.combinations(cities,2)] 
airlines = ['delta', 'united'] 

я хочу построить словарь словарей, «информация», чьи ключи комбинации городов выше + каждой авиакомпании (так 12 всего ключей), и каждая из них ключи содержат ключ «city1» и «city2», который заполняется с помощью списка citypairs. Я пытаюсь что-то вроде:

info = { 
'{city1}/{city2} {airline}'.format(city1=city1, city2=city2, airline=airline): { 
    "city1": city1, "city2": city2 
    for city1, city2 in citypairs 
    } 
    for city1, city2 in citypairs 
    for airline in airlines 
    } 

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

info = { 
'{city1}/{city2} {airline}'.format(city1=city1, city2=city2, airline=airline): { 
    "city1": "whatever", "city2": "whatever" 
    } 
    for city1, city2 in citypairs 
    for airline in airlines 
    } 

, то это будет работать и просто создавать фиктивные значения «Какие бы ни было» для city1 и City2 для каждого ключа в «инфо «

Этот пример может показаться глупым или чрезмерно сложным, но в основе моего вопроса лежит вопрос о том, как я могу перебирать список кортежей, чтобы заполнить city1 и city2 в этом примере - я после этого, потому что реальный проект i мне нужна такая гибкость

+0

Каковы требуемые значения 'info'? –

+0

Неправильный синтаксис: '{" city1 ": city1," city2 ": city2 для города1, city2 в citypairs}'. Что это должно быть? Словарь с двумя записями на запись? Или вы просто хотите, чтобы оба из них были добавлены как отдельные записи, такие как '{k: v для city1, city2 в citypairs для k, v in (('city1', city1), ('city2', city2))}'? – TigerhawkT3

+0

пример желаемого: информация [newyork/london delta] [city1] будет равна «newyork» и ...[city2] будет равняться «Лондону». – laszlopanaflex

ответ

1

Я считаю, что решение проще, чем вы это делаете:

from itertools import combinations 

cities = ['newyork','london','tokyo','paris'] 
citypairs = combinations(cities, 2) 
airlines = ['delta', 'united'] 

info = {'{city1}/{city2} {airline}'.format(city1=city1, city2=city2, airline=airline): {"city1": city1, "city2": city2} 
    for city1, city2 in citypairs 
     for airline in airlines 
} 

print(info) 
print() 
print(info["newyork/london delta"]["city1"]) 

ВЫХОД

{ 'Лондон/Токио дельта': { 'city1': 'Лондон', 'City2': 'Токио'}, 'NewYork/Лондон дельта': { 'city1 ':' new ',' city2 ':' london '},' london/paris delta ': {' city1 ':' london ',' city2 ':' paris '},' london/tokyo united ': {' city1 ':' london ',' city2 ':' tokyo '},' tokyo/paris united ': {' city1 ':' tokyo ',' city2 ':' paris '},' newyork/paris delta ': {' city1 ':' new ',' city2 ':' paris '},' tokyo/paris delta ': {' city1 ':' tokyo ',' city2 ':' paris '},' newyork/paris united ': {' city1 ':' new'ork ',' city2 ':' paris '},' london/paris united ': {' city1 ':' london ',' city2 ':' paris '},' newyork/london united ': {' city1 ':' newyork ',' city2 ': 'london'}, 'newyork/tokyo delta': {'city1': 'newyork', 'city2': 'tokyo'}, 'newyork/tokyo united': {'city1': 'newyork', 'city2': 'Токио'}}

NewYork

1
info = { 
'{city1}/{city2} {airline}'.format(**vars()) : 
    { "city1": city1, "city2": city2 } 
    for city1, city2 in citypairs 
    for airline in airlines 
    } 

выходы:

{'london/paris delta': {'city1': 'london', 'city2': 'paris'}, 
'london/paris united': {'city1': 'london', 'city2': 'paris'}, 
'london/tokyo delta': {'city1': 'london', 'city2': 'tokyo'}, 
'london/tokyo united': {'city1': 'london', 'city2': 'tokyo'}, 
'newyork/london delta': {'city1': 'newyork', 'city2': 'london'}, 
'newyork/london united': {'city1': 'newyork', 'city2': 'london'}, 
'newyork/paris delta': {'city1': 'newyork', 'city2': 'paris'}, 
'newyork/paris united': {'city1': 'newyork', 'city2': 'paris'}, 
'newyork/tokyo delta': {'city1': 'newyork', 'city2': 'tokyo'}, 
'newyork/tokyo united': {'city1': 'newyork', 'city2': 'tokyo'}, 
'tokyo/paris delta': {'city1': 'tokyo', 'city2': 'paris'}, 
'tokyo/paris united': {'city1': 'tokyo', 'city2': 'paris'}} 

Здесь я использовал terser форму format(), который смотрит на локальных переменных, чтобы найти контент для строк формата.

Вы были очень близки к тому, что, казалось, просили. Не знаете, почему вы указали в значениях для вашего второго уровня dict s с "whatever", так как вы уже сгенерировали переменные city1 и city2 в понимании. Просто используя это завершает схему.