2012-04-25 3 views
3

У меня есть функция, которая создает случайное число экземпляров объектов. Ради демонстрации общей идеи мы собираемся притвориться, что это алгоритм для создания серии нелепоподобных комнат.Создание имен экземпляров из списка (Python)

Требования таковы, что я не буду знать, сколько экземпляров будет заблаговременно; они генерируются случайным образом и на лету.

Вкратце: я полностью осознаю, что следующий код нефункциональный, но он должен (надеюсь,!) Продемонстрировать мои цели.

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 соответственно.

Есть ли простой способ сделать это? Есть ли способ сделать этот период?

--Edit--

Гигантский «спасибо» Ник Оделл его ответа. Это не полная копия/вставка - но это вариант, который работает для того, что мне нужно;

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) 
+0

В чем проблема? Создание букв, чтобы идти с цифрами? Назначение меток классу? Я не совсем уверен, что у вас здесь проблема. –

+0

Итак, вы хотите, чтобы объекты уровня n были названы членами класса Levelbuild? Возможно, вам захочется пересмотреть свой дизайн, так как вы, вероятно, захотите, чтобы они были сохранены в виде более легко истребимого упорядоченного набора данных, например списка или заказанного dict, и сохранялись под сервером levelmanager или levelstore, а не под самим строителем. –

+0

Для того, что стоит, самый простой способ сгенерировать имена будет делать с '' dict (перечислять (string.ascii_lowercase)) '' - предположив, что вы знали, что у вас всегда будет менее 26 элементов. (Что, по-видимому, все правильно, учитывая ваше текущее решение). –

ответ

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.

+0

Совершенно уместно поместить строителя в имя класса в зависимости от его реализации. Однако на самом деле нет смысла хранить встроенные элементы в качестве членов класса, если вы называете его строителем. –

+0

@ sr2222: Конечно, иногда у вас есть объект, который просто создает другие объекты. Однако это не выглядит так. Если это так, не обращайте внимания :) – Eevee

+0

Лучше 'для имени, i в перечислении (...): self.rooms.append (Roombuilder (chr (ord ('a') + nameint)))' или подобное, t список имен. – agf

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 комнат.

+0

Чистый и простой подход Питонов. –

+0

Это не совсем то, что я использую ... но это дало мне необходимую мне информацию, спасибо! :) –

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 ч. ave один в /usr/share/dict). Если вам нужны текстовые слова, я на самом деле написал a Python script to generate such 'words' using Markov Chains, который доступен под GPL. Естественно, вам придется проверить их на уникальность.

Смежные вопросы