Python - преобразование числа в букву без оператора if - PullRequest
2 голосов
/ 24 сентября 2011

Я создаю программу для своих собственных целей (программу именования), которая полностью генерирует случайное имя.Проблема в том, что я не могу присвоить число букве, так как бытие 1 и z равны 26, а существо 0 и z равны 25. Это дает мне ошибку SyntaxError.Мне нужно назначить это, потому что случайное целое число (1,26) вызывает букву (если случайное целое число равно 1, выберите A) и печатает имя.Ваш совет, и это работает, я благодарен за это, но я хотел бы, чтобы моя программа создавала читаемые имена, или более процедурные.Вот пример имени после того, как я настроил свою программу: ddjau.Теперь это не похоже на имя, поэтому я хочу, чтобы моя программа работала так, как если бы она создавала РЕАЛЬНЫЕ имена, такие как Самуил или другие распространенные имена.Спасибо!

РЕДАКТИРОВАТЬ (2):

Спасибо, Адам, но мне нужно что-то вроде «семени», чтобы пользователь мог ввести его для начала имени.(Семя = A, Имя = Адам. Семя = G, Имя = Джордж.) Должен ли я сделать это, просматривая файл построчно, в самом начале?Если да, то как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2011

Короткий ответ
Посмотрите словари Python, чтобы разрешить назначения типа 1 = 'a'. Ниже у меня есть рабочий пример, который генерирует случайное имя на основе пола и «мусора».

Ответственность
Я не до конца понимаю (с помощью кода), что вы пытаетесь выполнить с помощью char / ord и случайной буквы. Также обратите внимание, что, не имея абсолютно никакого представления о ваших целях и требованиях к дизайну, я сделал пример более сложным, чем это может понадобиться в учебных целях.

Дополнительные ресурсы
* Документы Python для словаря
* Использование словарных отношений Python для поиска в обоих направлениях

В ответ на последнее редактирование
Если вы хотите создать случайные «настоящие» имена, я думаю, что вам лучше всего использовать большой список имен и просто выбрать случайный. На вашем месте я бы изучил что-то, связанное с результатами переписи: мужчин и женщин . Обратите внимание, что male_names.txt и female_names.txt являются копией списка, найденного на веб-сайте переписи. Как заявление об отказе от ответственности, я уверен, что есть более эффективный способ загрузки / чтения файла. Просто используйте этот пример в качестве доказательства концепции.

Обновление
Вот быстрый и грязный способ посеять случайные значения. Опять же, я не уверен, что это самый питонический или самый эффективный способ, но он работает.

Пример

    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
2 голосов
/ 24 сентября 2011

chr (см. здесь ) и ord (см. здесь ) - две функции, которые вы ищете (хотя вы, кажется, уже знаете о последнем) , Перейдите по этим ссылкам для более подробного объяснения.

Первый дает вам односимвольную строку на основе целого числа, второй выполняет обратную операцию (технически, он также обрабатывает 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
0 голосов
/ 24 сентября 2011

Я не совсем уверен, что вы пытаетесь сделать, но вы можете преобразовать число в букву с помощью функции chr() . chr() принимает код ASCII, поэтому, если вы хотите использовать вместо него диапазон [0, 25], вы можете изменить его следующим образом:

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