我创建了两个列表。其中一个用于音符的名称,另一个用于音符的频率。
简而言之,就像这样:
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]]
还有其他办法吗?
答案 0 :(得分:2)
将它们变成dict
:
note_lookup = dict(zip(note_name, note_freq))
然后note_lookup['A1']
会让你55
,note_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