1

我正在编写一个概念学习程序,我需要将索引转换为类别名称。

例如:

# 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', '?']. 最pythonic的方法是什么?

4

6 回答 6

4

我认为您需要一个基本的字典速成课程:

这是一本合适的字典:

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

您可以轻松地调用字典中的个别事​​物:

>>>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]

当然,没有什么可以阻止您将字典作为字典中的值......在其他字典的值中......

于 2013-05-29T22:25:08.870 回答
3

你可以做:

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

该函数zip()可用于组合到可迭代对象;在这种情况下列出。

于 2013-05-29T21:50:32.627 回答
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, '?'],
 ['?', '?', '?', '?', '?']]
于 2013-05-29T22:02:48.923 回答
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', ...], ...}
于 2013-05-29T21:51:53.180 回答
0

如果您需要保持 d1、d2 等原样:

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

非常丑陋和脆弱,但它应该适用于您现有的代码。

于 2013-05-29T22:07:55.467 回答
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.
于 2016-01-29T01:09:48.387 回答