python - 为列表中的每个值分配字母

1 投票
10 回答
7499 浏览
提问于 2025-04-16 19:54

我有一个值的列表,在一个循环里使用。比如说,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 的话,这个肯定会出错。

撰写回答