【问题标题】:Python - Converting a Number to a Letter without an if statementPython - 在没有 if 语句的情况下将数字转换为字母
【发布时间】:2011-11-24 01:07:10
【问题描述】:

我正在为自己的目的制作一个程序(命名程序),它完全生成一个随机名称。问题是我不能给一个字母分配一个数字,比如a是1,z是26,或者a是0,z是25。它给了我一个SyntaxError。我需要分配这个,因为随机整数 (1,26) 会触发一个字母(如果随机整数为 1,则选择 A)并打印名称。

编辑:

我已经实施了您的建议,并且它有效,对此我很感激,但我希望让我的程序创建可读的名称,或者更程序化。这是我调整程序后的名称示例:ddjau。现在这看起来不像是一个名字,所以我希望我的程序能够像创建真实的名字一样工作,比如 Samuel 或其他常见的名字。谢谢!

编辑(2):

谢谢,亚当,但我需要一种“种子”让用户输入名称的开头。 (Seed = A,Name = Adam。Seed = G,Name = George。)我应该在一开始就逐行搜索文件吗?如果是这样,我该怎么做?

【问题讨论】:

  • 我会就语法错误提供帮助,让其他人回答您的问题。语句1 = 'a' 会给你一个SyntaxError,因为你试图分配给文字1。你只能分配给一个变量。仅供参考。 :)
  • 你真的有130个变量吗?听说过字符串、列表和循环吗?
  • 您只是在寻找获取随机字母的方法吗?试试from random import choice 然后choice([chr(c) for c in range(ord("a"), ord("z") + 1)]) 或者如果你喜欢更短的代码(但这是一个hack):choice("abcdefghijklmnopqrstuvwxyz")
  • 如果那是生产代码,我们手头就会有一些有价值的 DWTF :x 还要注意,我们显然可以用 'a'-'z' 调用 randint 而不是整个+ 'a'对于范围..

标签: python string variables integer


【解决方案1】:

简答题
查看 Python 字典以允许 1 = 'a' 类型分配。下面我有一个工作示例,它将根据性别和“垃圾”生成一个随机名称。

免责声明
我不完全理解(通过代码)你试图用 char/ord 和一个随机字母来完成什么。另请注意,我完全不了解您的设计目标或要求,因此我使示例比出于教学目的可能需要的更复杂。

其他资源
* Python Docs for dictionary
* Using Python dictionary relationship to search both ways

响应上次修改
如果您正在寻找随机的“真实”姓名,我认为您最好的选择是使用大量姓名并随机选择一个。如果我是你,我会研究与人口普查结果相关的内容:malesfemales。请注意,male_names.txt 和 female_names.txt 是在人口普查网站上找到的列表的副本。作为免责声明,我确信有一种更有效的方式来加载/读取文件。只需将此示例用作概念证明。

更新
这是播种随机值的一种快速而肮脏的方法。同样,我不确定这是最 Pythonic 的方式还是最有效的方式,但它确实有效。

示例

    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

【讨论】:

  • 谢谢!这正是我想要的!
  • 这很好用,但我需要一种“种子”来作为起始字母。 F 中的“种子”是 Fred,或者 M 是 Matthew。也许是一段代码来搜索所有行中的第一个字母是“种子”。谢谢!
【解决方案2】:

chr(参见here)和ord(参见here)是您正在寻找的两个函数(尽管您似乎已经知道后者)。按照这些链接获取更详细的说明。

第一个为您提供基于整数的单字符字符串,第二个执行反向操作(从技术上讲,它也处理 Unicode,chr 没有,但如果您有 unichr需要)。

您的代码可以基于以下内容:

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

【讨论】:

  • 我正在使用 ord,但它会找到字母在字母表中的位置,而不是将字母分配给字母表的位置。我还没有尝试过 chr,你能给我简单解释一下它的用途吗?
  • @Rob,我使链接更加明显,以便您查看完整的详细信息,但我还在末尾添加了一点 sn-p。
【解决方案3】:

我不完全确定您要做什么,但您可以使用 chr() function 将数字转换为字母。 chr() 接受一个 ASCII 码,所以如果你想使用 [0, 25] 范围,你可以像这样调整它:

chr(25 + ord('a'))    # 'z'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2018-03-28
    相关资源
    最近更新 更多