Python中的简单随机名称生成器

时间:2011-04-20 14:09:36

标签: python

我有一个包含第一个和最后一个'syllables'的文本文件,用[part1]和[part2]划分:

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

我想做的就是在[part1]和[part2]之间选择一条随机线,然后在[part2]和文件末尾之间选择另一条随机线,并将两者连接在一起(例如“Aedar”, “Moglar”)创建随机名称。

但是我不确定如何使用readline()有效地解析文本文件。有没有比顺序扫描每一行更好的方法,并将所有这些存储在一个列表中,从那里我可以选择一个随机元素?

4 个答案:

答案 0 :(得分:11)

将字典序列化(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)

答案 1 :(得分:5)

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

答案 2 :(得分:3)

除非您事先知道有多少前缀和后缀,否则您必须在某个时刻读取整个文件。因为我假设你没有,或者它可以改变而且你不想保存一个用于存储它的数字,你将不得不通读该文件,而readline()是一种很好的方法。< / p>

但是,您可以预处理文本文件,以便它使用其他格式,例如pickle文件。换句话说,将文本文件读入字典,然后挑选该字典。字典可能看起来像这样:

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

从数组的长度,您可以确定最大随机数是多少。它应该比每次逐行读取整个文件更有效。如果没有,至少它是一个更优雅的解决方案。

答案 3 :(得分:1)

修改后的@eumiro's script

#!/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