Простой генератор случайных имен в Python



У меня есть текстовый файл, содержащий первый и последний "слоги", разграниченные [часть 1] и [часть 2]:




[part1]
Ae
Di
Mo
Fam
[part2]
dar
kil
glar
tres


Все, что я хочу сделать, это выбрать случайную строку между [part1] и [part2], а затем другую случайную строку между [part2] и концом файла и соединить их вместе (например, "Aedar", "Moglar"), чтобы создать случайные имена.

Однако я не уверен, как эффективно разобрать текстовый файл с помощью readline (). Есть ли лучший способ, чем сканировать каждую строку последовательно, и хранение всех их в списке, откуда я могу выбрать случайный элемент?

386   4  

4 ответов:

Сериализуйте (pickle ) словарь в файл вместо этого.

Пример:

# create the dict and save it to a file
d={
'part1':[
    'Ae',
    'Di',
    'Mo',
    'Fam',],
'part2':[
    'dar',
    'kil',
    'glar',
    'tres',],
}

import pickle
f=open('syllables','w')
pickle.dump(d,f)
f.close()


# read the dict back in from the file
f1=open('syllables','r')
sd=pickle.load(f1)
f1.close()

import random
first_part=sd['part1'][random.randint(0,len(sd['part1'])-1)]
second_part=sd['part2'][random.randint(0,len(sd['part2'])-1)]

print '%s%s'%(first_part,second_part)
import random
parts = {}

with open('parts.txt', 'r') as f:
    currentList = []
    for line in f.readlines():
        line = line.strip()
        if line.startswith('[') and line.endswith(']'):
            currentList = []
            parts[line[1:-1]] = currentList
        else:
            currentList.append(line.strip())


for i in xrange(10):    
    print ''.join(random.choice(parts[partName]) for partName in sorted(parts))

Возвращает (случайным образом):

Aekil
Didar
Mokil
Mokil
Moglar
Moglar
Diglar
Famdar
Famdar
Modar

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

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

dic = {'prefixes': ['Ae' ,'di', ...], 'suffixes': ['dar', 'kil', ...]}

Исходя из длины массивов, вы можете определить, какое максимальное случайное число. Это должно быть более эффективно, чем чтение всего файла строка за строкой каждый раз. А если нет, то, по крайней мере, это более элегантное решение.

Модифицированный сценарий@eumiro:

#!/usr/bin/env python
import fileinput
import random
import re
from collections import defaultdict

partname = ''
parts = defaultdict(list)
for line in fileinput.input():
    line = line.rstrip()
    if line.startswith('[') and re.match(r'\[part\d+\]', line):
        partname = line
    else:
        parts[partname].append(line)

parts_list = list(map(parts.get, sorted(parts)))
for _ in range(10):
    print(''.join(map(random.choice, parts_list)))

Вывод

Famglar
Famkil
Didar
Ditres
Aedar
Famglar
Ditres
Famtres
Ditres
Modar

Comments

    Ничего не найдено.