2013-03-29 4 views
2

Мне нужно объединить три списка в один словарь. Эти списки от чтения текстового файла, который я отформатированный, и вот фрагмент из этого файла:Слияние трех списков в один словарь

maker =['Horsey', 'Ford', 'Overland', 'Scripps-Booth'] 

year = ['1899', '1909', '1911', '1913'] 

model = ['Horseless', 'Model T', 'OctoAuto', 'Bi-Autogo'] 

В следующем:

car_dict = {'Horsey':1899,'Horseless','Ford':1909,'Model T','Overland' : 1911, 'OctoAuto', 'Scripps-Booth' : 1913, 'Bi-Autogo'} 

Вот что я сделал:

def car_data_merge(car_maker,car_model,car_year): 
    car_dict = {} 
    car_merge = [] 

    car_dict = defaultdict(partial(defaultdict,list)) 

    for (car_maker,car_model,car_year) in zip(car_maker,car_model,car_year): 
     car_dict[car_year][car_model].append(car_maker) 
    print(car_dict) 

Когда я ввожу это, я получаю:

{'Horsey': defaultdict(<class 'list'>, {'1899': ['Horseless']}) 

Не все данные из списка показаны, и я не хочу показывать defaultdict.

Когда я попробовал следующее:

def car_data_merge(car_maker,car_data): 
    car_dict = {} 
    car_merge = [] 
    car_merge = zip(car_maker,car_data) 
    car_dict = dict(car_merge) 
    print(car_dict) 

    ### car_data holds both year and model #### 

только часть данных показывает вверх:

'Horsey':'Horseless',':1909,'Model T 

Что я должен делать?

ответ

5

Вы были на правильном пути с zip, bu т нужно учитывать, что:

The returned list is truncated in length to the length of the shortest argument sequence.

Если вы хорошо с этим, вы можете сжать ваши данные в список кортежей, пронестись ключи, и рука все прочь к dict().

Если вы хотите обрабатывать пропущенные значения, контроль itertoolsizip_longest (Python 2) или zip_longest (Python 3) где

If the iterables are of uneven length, missing values are filled-in with fillvalue.

try: 
    # Python 2 
    from itertools import izip_longest 
    zip_longest = izip_longest 
except ImportError: 
    # Python 3 
    from itertools import zip_longest 

from pprint import pprint 


def main(): 
    maker =['Horsey', 'Ford', 'Overland', 'Scripps-Booth', 'FutureX', 'FutureY'] 
    year = ['1899', '1909', '1911', '1913', '20xx'] 
    model = ['Horseless', 'Model T', 'OctoAuto', 'Bi-Autogo'] 

    car_data = dict(zip(maker, zip(year, model))) 
    car_data_longest = {mk: (yr, md) for mk, yr, md in zip_longest(maker, year, model)} 

    pprint(car_data) 
    pprint(car_data_longest) 

Выход:

{'Ford': ('1909', 'Model T'), 
'Horsey': ('1899', 'Horseless'), 
'Overland': ('1911', 'OctoAuto'), 
'Scripps-Booth': ('1913', 'Bi-Autogo')} 
{'Ford': ('1909', 'Model T'), 
'FutureX': ('20xx', None), 
'FutureY': (None, None), 
'Horsey': ('1899', 'Horseless'), 
'Overland': ('1911', 'OctoAuto'), 
'Scripps-Booth': ('1913', 'Bi-Autogo')} 
+0

Вопрос: Я раньше не использовал izip, и я получаю 'values ​​= itertools.izip (год, модель)' 'Объект 'AttributeError:' module 'не имеет атрибута' izip'', что мне делать? –

+0

@ThomasJones Это 'izip_longest' – pradyunsg

+0

@ThomasJones Какую версию Python вы используете? 'itertools.izip' был добавлен в Python 2.3 и изменен в Python 2.4. 'itertools.izip_longest' является новым в Python 2.6. –

2

Это что, вы ищите?

>>> car_dict = {maker[i]:[year[i], model[i]] for i in xrange(len(maker))} 
>>> car_dict 
{'Overland': ['1911', 'OctoAuto'], 'Horsey': ['1899', 'Horseless'], 'Scripps-Booth': ['1913', 'Bi-Autogo'], 'Ford': ['1909', 'Model T']} 
3

Похоже, что вы хотите:

{maker: (year, model) for maker, model, year in zip(car_maker,car_model,car_year)} 

, который даст вам:

{'Horsey':(1899,'Horseless'),'Ford':(1909,'Model T'),'Overland':(1911,'OctoAuto')...} 
4

Как это:

>>> maker =['Horsey', 'Ford', 'Overland', 'Scripps-Booth'] 
>>> year = ['1899', '1909', '1911', '1913'] 
>>> model = ['Horseless', 'Model T', 'OctoAuto', 'Bi-Autogo'] 
>>> d = dict(zip(maker,zip(year,model))) 
{'Overland': ('1911', 'OctoAuto'), 'Horsey': ('1899', 'Horseless'), 'Scripps-Booth': ('1913', 'Bi-Autogo'), 'Ford': ('1909', 'Model T')} 
+0

Вам не нужен вызов 'list'. Zip создает список кортежей, из которых вы можете создать словарь – Abhijit

+0

@Abhijit Упс, вы правы в этом. Удалено – TerryA

+0

Кто-то проголосовал за этот ответ; могли бы они объяснить, почему? – TerryA

Смежные вопросы