从列表中创建实例名称(Python)

时间:2012-04-25 20:12:59

标签: python

我有一个构建随机数量的对象实例的函数。为了展示一般的想法,我们假装这是一个算法来构建一系列类似nethack的房间。

要求是这样的,我不知道预先会有多少个实例;这些都是随机生成的。

简要说明:我完全清楚以下代码是无效的,但应该(希望!)证明我的目标。

import random

class Levelbuild(object):

    def __init__(self):
        self.l1 = dict({0:'a',1:'b',2:'c',3:'d',4:'e',5:'f',6:'g',7:'h',8:'i'})
        # Pick a random number between 4 and 9.
        for i in range(random.randint(4,9)):
            self.l1[i] = Roombuilder()

如果我们假设所选的随机整数是5,理想的结果将是5个Roombuilder()实例;分别标记为a,b,c,d和e。

有一种简单的方法吗?有没有办法做这个时期?

- 编辑 -

巨人“谢谢”Nick ODell的回答。这不是一个完整的复制/粘贴 - 但它是一个适合我需要的变体;

import random

class Room(object):
    def __init__(self):
        self.size = (5,5)

class Level(object):

    def __init__(self):
        roomnames = ['a','b','c','d','e','f','g','h','i']
        self.rooms = {}
        for i in range(random.randint(4, 9)):
            self.rooms[roomnames[i]] = Room()

而不是手工建立每个“房间”,我现在可以......

test = Level()
print test.rooms['a'].size
>>> (5,5)

3 个答案:

答案 0 :(得分:3)

import string
import random

class Levelbuild(object):

  def __init__(self,min_room_count,max_room_count):

    rooms_temp = [new RoomBuilder() for i in range(random.randint(min_room_count,max_room_count))]
    self.l1 = dict(zip(string.ascii_lowercase, rooms_temp))

注意:如果超过26个房间,这将无声地失败。

答案 1 :(得分:0)

实际上,你非常接近。你不需要词典;只需使用一个列表。 (顺便说一下,{...}已经是一个字典,所以将它包装在dict()中并没有做任何事情。)

roomnames = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
self.rooms = []
for i in range(random.randint(4, 9)):
    self.rooms.append(Roombuilder(roomnames[i]))

对于它的价值,将builder放在一个类的名称中有点时髦。对象是房间,对吗?所以类型应该是Room

答案 2 :(得分:0)

作为更通用解决方案的另一个答案(主要作为Nick ODell's answer的伴侣),如果你想处理任意数量的名称,那么这是一个非常简单的无限生成器解决方案:

import string
import itertools

def generate_names(characters):
    for i in itertools.count(1):
        for name in itertools.product(characters, repeat=i):
            yield "".join(name)

然后您可以像使用任何其他生成器一样使用它:

>>>print(dict(zip(generate_names(string.ascii_lowercase), range(30))))
{'aa': 26, 'ac': 28, 'ab': 27, 'ad': 29, 'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'm': 12, 'l': 11, 'o': 14, 'n': 13, 'q': 16, 'p': 15, 's': 18, 'r': 17, 'u': 20, 't': 19, 'w': 22, 'v': 21, 'y': 24, 'x': 23, 'z': 25}

如果您需要生成实际的名称,那么您有几个选择。如果您需要一个真实的单词,请从字典文件中选择(大多数Linux用户在/usr/share/dict中有一个)。如果你需要类似文字的东西,那么我实际上已经写了a Python script to generate such 'words' using Markov Chains,它可以在GPL下找到。当然,你必须检查这些是否具有独特性。

相关问题