Python - 无需 if 语句将数字转换为字母
我正在制作一个程序(一个命名程序),它可以完全随机生成一个名字。问题是我无法把字母和数字对应起来,比如把a当作1,z当作26,或者把a当作0,z当作25。这样做会出现语法错误。我需要这样做是因为随机生成的整数(1到26之间)会对应一个字母(比如如果随机数是1,就选择A),然后打印出这个名字。
编辑:
我已经按照你的建议进行了修改,现在可以正常工作了,我很感激。不过,我希望我的程序能生成更易读的名字,或者说更有规律的名字。比如我调整程序后生成的名字是:ddjau。这个名字看起来不太像个名字,所以我希望我的程序能生成真正的名字,比如Samuel或者其他常见的名字。谢谢!
编辑(2):
谢谢你,Adam,但我需要一种“种子”让用户输入名字的开头是什么。(种子 = A,名字 = Adam。种子 = G,名字 = George。)我应该通过逐行搜索文件来实现这一点吗?如果是的话,我该怎么做呢?
3 个回答
我不太确定你想要做什么,但你可以用 chr()
函数 把数字转换成字母。chr()
这个函数需要一个 ASCII 码,所以如果你想用范围 [0, 25] 的数字,你可以这样调整:
chr(25 + ord('a')) # 'z'
chr
(可以查看这里)和ord
(可以查看这里)是你需要的两个函数(虽然你似乎已经知道后者了)。点击这些链接可以获取更详细的解释。
第一个函数根据一个整数给你一个单字符的字符串,第二个函数则是反向操作(技术上来说,它也能处理Unicode,而chr
不能,不过如果你需要的话,可以使用unichr
来处理Unicode)。
你可以根据以下代码来编写你的代码:
ch = "E"
print ord (ch) - ord ("A") + 1 # should give 5 for the fifth letter
val = 7
print chr (val + ord ("A") - 1) # should give G, the seventh letter
简短回答
可以看看Python中的字典,这样就能实现像1 = 'a'
这样的赋值方式。下面我给了一个示例,这个示例可以根据性别和“窝”(一窝小动物)生成一个随机名字。
免责声明
我不太明白你想通过char/ord和随机字母实现什么。另外,由于我对你的设计目标或需求完全不了解,所以我把这个示例做得比实际需要的复杂一些,主要是为了教学目的。
额外资源
* Python字典的官方文档
* 使用Python字典关系进行双向搜索
针对最后一次编辑的回应
如果你想生成随机的“真实”名字,我觉得最好的办法是使用一个大的名字列表,然后随机选择一个。如果我是你,我会去查查和人口普查结果相关的内容:男性名字和女性名字。请注意,male_names.txt和female_names.txt是从人口普查网站找到的名字列表的副本。作为免责声明,我相信还有更有效的方法来加载/读取文件。可以把这个示例当作一个概念验证。
更新
这里有一个快速且简单的方法来生成随机值。再次强调,我不确定这是否是最符合Python风格或最有效的方法,但它确实能工作。
示例
import random
import time
def get_random_name(gender, seed):
if(gender == 'male'):
file = 'male_names.txt'
elif(gender == 'female'):
file = 'female_names.txt'
fid = open(file,'r')
names = []
total_names = 0
for line in fid:
if(line.lower().startswith(seed)):
names.append(line)
total_names = total_names + 1
random_index = random.randint(0,total_names)
return names[random_index]
if (__name__ == "__main__"):
print 'Welcome to Name Database 2.2\n'
print '1. Boy'
print '2. Girl'
bog = raw_input('\nGender: ')
print 'What should the name start with?'
print 'A, Ab, Abc, B, Ba, Br, etc...'
print ''
l = raw_input('Leter(s): ').lower()
new_name = ''
if bog == '1': # Boy
print get_random_name('male',l)
elif bog == '2':
print get_random_name('female',l)
输出
Welcome to Name Database 2.2
1. Boy
2. Girl
Gender: 2
What should the name start with?
A, Ab, Abc, B, Ba, Br, etc...
Leter(s): br
BRITTA