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

2024-05-15 20:59:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含第一个和最后一个“音节”的文本文件,用[part1]和[part2]划分:

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

我只想在[part1]和[part2]之间选择一条随机线,然后在[part2]和文件结尾之间选择另一条随机线,并将这两条线连接在一起(例如“Aedar”、“Moglar”)以创建随机名称。

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


Tags: 文件结尾mo音节文本文件part2part1fam
3条回答
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

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

在某个时刻,您将不得不通读整个文件,除非您事先知道有多少前缀和后缀。因为我假设您不需要,或者它可以更改,并且您不想维护一个数字来存储它,所以您必须通读该文件,readline()是一个很好的方法。

但是,可以对文本文件进行预处理,使其使用另一种格式,例如pickle文件。换言之,将文本文件读入词典,并对该词典进行pickle操作。字典可能看起来像这样:

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

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

相关问题 更多 >