我有一个26位的名单。我想根据数字打印出一个字母表列表。例如,我有一个列表(由输入中的26个数字组成):
[0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
我确实喜欢输出:
[e,e,l,s]
'e'在输出上是2次,因为在第4个索引上,根据英文字母表格形成的是'e',第4个索引上的数字是2.对于'l,它是相同的'因为它在第11个索引上,它的数字是1.对s来说也是如此。其他字母不会出现,因为它的数字为零。
例如,我提供另一个26位输入。像这样:
[1,2,2,3,4,0,3,4,4,1,3,1,4,4,1,0,0,0,0,0,4,2,3,2,2,1]
输出应为:
[a,b,b,c,c,d,d,d,e,e,e,e,g,g,g,h,h,h,h,i,i,i,i,j,k,k,k,l,m,m,m,m,n,n,n,n,o,u,u,u,u,v,v,w,w,w,x,x,y,y,z]
是否有可能在Python 3中执行此操作?
答案 0 :(得分:5)
您可以使用chr(97 + item_index)
获取相应的项目,然后乘以项目本身:
In [40]: [j * chr(97 + i) for i, j in enumerate(lst) if j]
Out[40]: ['ee', 'l', 's']
如果您希望它们分开,您可以使用itertools
模块:
In [44]: from itertools import repeat, chain
In [45]: list(chain.from_iterable(repeat(chr(97 + i), j) for i, j in enumerate(lst) if j))
Out[45]: ['e', 'e', 'l', 's']
答案 1 :(得分:2)
是的,在Python 3中肯定是可能的。
首先,定义数字的示例列表(如您所做)和用于存储字母结果的空列表。
与索引关联的实际逻辑是使用 chr(97 +索引), ord(" a")= 97 因此,反向是 chr(97)= a 。第一个索引是0,因此97保持不变,并且迭代计数增加和你的字母也是。
接下来,一个嵌套的for循环迭代数字列表,然后另一个for循环根据数字列表多次追加相同的字母。
我们可以这样做 - > result.append(chr(97 + i)* my_list [i])在第一个循环中,但它不会分别产生每个字母[a,b,b,c,c, d,d,d ......]而它看起来像[a,bb,cc,ddd ...]。
[System.Environment]::GetEnvironmentVariable('[TF]MYVAR')
答案 2 :(得分:1)
@Kasramvd
的精彩答案的替代方案import string
n = [0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
res = [i * c for i, c in zip(n, string.ascii_lowercase) if i]
print(res) # -> ['ee', 'l', 's']
你的第二个例子产生:
['a', 'bb', 'cc', 'ddd', 'eeee', 'ggg', 'hhhh', 'iiii', 'j', 'kkk', 'l', 'mmmm', 'nnnn', 'o', 'uuuu', 'vv', 'www', 'xx', 'yy', 'z']
将字符串('bb'
拆分为'b', 'b'
)可以使用标准架构完成:
[x for y in something for x in y]
答案 3 :(得分:1)
使用稍微不同的方法,单独给出字符,例如:
import string
a = [0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
alphabet_lookup = np.repeat(np.arange(len(a)), a)
letter_lookup = np.array(list(string.ascii_lowercase))
res = letter_lookup[alphabet_lookup]
print(res)
获得
['e' 'e' 'l' 's']