python - 为列表中的每个值分配字母
我有一个值的列表,在一个循环里使用。比如说,myList = [1,5,7,3]
,我用这个列表来创建一个柱状图(使用谷歌图表)。
我想给每个值标上一个字母(A-Z),比如说A代表1,B代表5,C代表7,D代表3。
我想知道在循环中怎么做这个比较好。
比如:
for x in myList:
x.label = LETTER OF THE ALPHABET
这个列表的长度可以是任意的,所以不一定只是A到D。
补充说明:
其实我的myList是一个对象的列表,而不是上面例子中的数字。每个对象都有一个标题(可以是数字、字母等),不过这些标题比较长,所以在谷歌图表上显示的时候会显得很乱。因此,我打算在图表上用字母标记,从A开始,B、C……一直到myList的长度,然后在图表上加一个说明,帮助人们把字母和实际的标题对应起来。我的myList的长度很可能会少于10,所以用字母标记不会出现不够用的情况。
希望这样能让事情更清楚一些。
10 个回答
1
首先,如果 myList
是一个整数列表,那么,
for x in myList:
x.label = LETTER OF THE ALPHABET
这个方法是行不通的,因为 int
类型的数字没有 label
这个属性。你可以遍历 myList
,然后把标签存储在一个列表里(这里叫 pairs
):
import string
pairs = []
for i, x in enumerate(myList):
label = string.letters(i) # will work for i < 52 !!
pairs.append( (label, x) )
# pairs is now a list of (label, value) pairs
如果你需要的标签超过52个,你可以使用一些随机字符串生成的函数,比如这个:
import random
def rstring(length=4):
return ''.join([ random.choice(string.uppercase) for x in range(length) ])
5
如果你想继续生成像 ...,Y,Z,AA,AB 这样的序列,可以使用 itertools.product 这个工具:
import string
import itertools
def product_gen(n):
for r in itertools.count(1):
for i in itertools.product(n, repeat=r):
yield "".join(i)
mylist=list(range(35))
for value, label in zip(mylist, product_gen(string.ascii_uppercase)):
print(value, label)
# value.label = label
输出的一部分:
23 X
24 Y
25 Z
26 AA
27 AB
28 AC
29 AD
2
import string
for i, x in enumerate(myList):
x.label = string.uppercase[i]
如果 len(myList) > 26
的话,这个肯定会出错。