在Python中一起分配两个列表的索引

时间:2016-04-20 16:42:31

标签: python

我创建了两个列表。其中一个用于音符的名称,另一个用于音符的频率。

简而言之,就像这样:

note_name = ['A1','B1','C1']

note_freq = [55, 61.74, 32.70]

我想要做的是将这两个列表索引分配在一起,这样当我键入列表note_name的元素时,它会打印列表note_freq的相应索引的值。简而言之,我想使用note_name类似变量的元素。例如,如果我在程序中输入A1,我希望打印值55,或者如果我输入C1,我希望打印值32.70

我尝试过类似的东西,但它没有用。它给了我KeyError : 1

note_name = ['A1','B1','C1']
note_freq = [55, 61.74, 32.70]

for i in range (0,3):
    globals() [note_name[i]] = globals() [note_freq[i]]

还有其他办法吗?

4 个答案:

答案 0 :(得分:2)

将它们变成dict

note_lookup = dict(zip(note_name, note_freq))

然后note_lookup['A1']会让你55note_lookup['B2']会让你61.74等等。

当然,如果您不需要个人list,您可以直接定义dict并保存一些工作:

note_lookup = {'A1': 55, 'B1': 61.74, 'C1': 32.70}

这比尝试按名称填充全局变量要好得多;避免对全局命名空间造成不必要的污染,并阻止令人讨厌的eval(以及等效于Py2,input)黑客攻击。只需在Py2(Py3上的raw_input)上使用input即可避免使用eval,并使用它返回的内容作为note_lookup的键。

答案 1 :(得分:1)

您需要一个dictionary,而不是两个列表:

notes = {'A1': 55, 'B1': 61.74}

typed_in = raw_input()

print notes[typed_in] # this will raise an exception if there's no such entry

答案 2 :(得分:1)

您可能需要地图或字典:

note_name = ['A1','B1','C1']
note_freq = [55, 61.74, 32.70]

note = { note_name[i]:note_freq[i] for i in range(len(note_name))}

print note['A1']

答案 3 :(得分:0)

字典是python的基本数据类型

In [57]: notes = dict(zip(note_name, note_freq))

In [58]: notes['C1']
Out[58]: 32.7

In [59]: notes
Out[59]: {'A1': 55, 'B1': 61.74, 'C1': 32.7}

与列表不同,词典的顺序未定义。如果订单与注释一样重要,那么请查看OrderedDict。这是一个字典,但也有一个明确的顺序。

In [60]: import collections

In [62]: notes = collections.OrderedDict(zip(note_name, note_freq))

In [63]: for note in notes:
   ....:     print '%s - %s' % (note, notes[notes])

A1 - 55
B1 - 61.74
C1 - 32.7