2013-05-29 2 views
1

Я пишу программу обучения концепции, где мне нужно преобразовать из индекса в название категории.Использование словаря в Python

Например:

# binary concept learning 
# candidate eliminaton learning algorithm 
import numpy as np 
import csv 

def main(): 
    d1={0:'0', 1:'Japan', 2: 'USA', 3: 'Korea', 4: 'Germany', 5:'?'} 
    d2={0:'0', 1:'Honda', 2: 'Chrysler', 3: 'Toyota', 4:'?'} 
    d3={0:'0', 1:'Blue', 2:'Green', 3: 'Red', 4:'White', 5:'?'} 
    d4={0:'0', 1:1970,2:1980, 3:1990, 4:2000, 5:'?'} 
    d5={0:'0', 1:'Economy', 2:'Sports', 3:'SUV', 4:'?'} 

    a=[0,1,2,3,4] 
    print a 

if __name__=="__main__": 
    main() 

Так [0,1,2,3,4] следует преобразовать в ['0', 'Honda', 'Green', '1990', '?']. Какой самый питонический способ сделать это?

+1

Почему у вас есть разные словари и используются индексы в качестве ключа? –

+0

каждый столбец соответствует одной категории. Например, [0] находится где автомобиль, а [1] - производитель и т. Д. –

+0

a [] - это список, содержащий 0,1,2,3,4, это не словарь. Пожалуйста, уточните свой вопрос: – PSS

ответ

3

Вы можете сделать:

data = [d1,d2,d3,d4,d5] 
print [d[key] for key, d in zip(a, data)] 

Функцией zip() может быть использована для объединения в итерируемые; списки в этом случае.

1

Я хотел бы использовать список dicts d = [d1, d2, d3, d4, d5], а затем список понимание:

[d[i][key] for i, key in enumerate(a)] 

Чтобы сделать все это более удобным для чтения, использование вложенных словарей - каждый из ваших словарей, кажется, представляет то, что вы могли бы дать более описательное имя, чем d1 или d2:

data = {'country': {0: 'Japan', 1: 'USA' ... }, 'brand': {0: 'Honda', ...}, ...} 
car = {'country': 1, 'brand': 2 ... } 
[data[attribute][key] for attribute, key in car.items()] 

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

Как полагает комментарий, словарь с сопредельными целыми числами в качестве ключей может быть заменен списком:

data = {'country': ['Japan', 'USA', ...], 'brand': ['Honda', ...], ...} 
+0

Не используйте словарь с пронумерованными клавишами, это просто глупо. В этом весь список, который поддерживает численное индексирование сам по себе. –

+0

Вот как данные были сохранены в исходном вопросе. Хотя да, в этом случае списки для данных будут иметь больше смысла. Называть ответ глупым ничего не помогает. – kai

+0

Хорошо, извините, это было немного сильно сформулировано. –

2

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

from pprint import pprint 

items = [[el.get(i, '?') for el in (d1,d2,d3,d4,d5)] for i in range(6)] 
pprint(items) 

[['0', '0', '0', '0', '0'], 
['Japan', 'Honda', 'Blue', 1970, 'Economy'], 
['USA', 'Chrysler', 'Green', 1980, 'Sports'], 
['Korea', 'Toyota', 'Red', 1990, 'SUV'], 
['Germany', '?', 'White', 2000, '?'], 
['?', '?', '?', '?', '?']] 
0

Если вам нужно держать d1, d2 и т.д. как есть:

newA = [locals()["d%d"%(i+1)][a_value] for i,a_value in enumerate(a)] 

Довольно уродливый и хрупкий, но он должен работать с существующим кодом.

4

Я думаю, что вам нужен базовый словарь ускоренный курс:

это правильный словарь:

>>>d1 = { 'tires' : 'yoko', 'manufacturer': 'honda', 'vtec' : 'no' } 

Вы можете вызвать invidual вещи в словаре легко:

>>>d1['tires'] 
'yoko' 
>>>d1['vtec'] = 'yes' #mad vtec yo 
>>>d1['vtec'] 
'yes' 

Словари разбиты на две разные секции, ключ и значение

testDict = {'key':'value'} 

Вы использовали словарь точно так же, как список:

>>>test = {0:"thing0", 1:"thing1"} #dictionary 
>>>test[0] 
'thing0' 

, который почти точно так же, как говорят

>>>test = ['thing0','thing1'] #list 
>>>test[0] 
'thing0' 

в вашем конкретном случае, вы можете либо правильно отформатируйте свои словари (я бы предложил что-то вроде masterdictionary = {'country': ['germany','france','USA','japan], 'manufacturer': ['honda','ferrarri','hoopty'] } etcetera, потому что вы могли бы назвать каждый отдельный элемент, который вам нужен намного проще

с тем же самым словаре:

>>>masterdictionary['country'][1] 
'germany' 

который dictionaryName['key'][iteminlistindex]

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

0

Вы не нужен словарь для этого вообще. Списки в python автоматически поддерживают индексирование.

def main(): 

    d1=['0','Japan','USA','Korea','Germany',"?"] 
    d2=['0','Honda','Chrysler','Toyota','?'] 
    d3=['0','Blue','Green','Red','White','?'] 
    d4=['0', 1970,1980,1990,2000,'?'] 
    d5=['0','Economy','Sports','SUV','?'] 
    ds = [d1, d2, d3, d4, d5] #This holds all your lists 

    #This is what range is for 
    a=range(5) 
    #Find the nth index from the nth list, seems to be what you want 
    print [ds[n][n] for n in a] #This is a list comprehension, look it up. 
Смежные вопросы