2013-05-11 4 views
-1

Это должно стать генератором случайных имен в конце, все случайные части работают. Единственная проблема в том, что она ДЕЙСТВИТЕЛЬНО случайна, получает странные вещи, такие как aaaaaaaa и т. Д. Итак, я пытаюсь добавить правило к , а не, разрешить 2 гласных друг за другом (то же самое касается согласных).Другой IndexError с python

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

import random 
import string 
import numpy as np 
from sys import argv 
import csv 
# abcdefghijklmnopqrstuvwxyz 
# Example output: floke fl0ke flok3 fl0k3 
# 


class facts: 
    kons = list('bcdfghjklmnpqrstvwxz') #20 
    voks = list('aeiouy') #6 
    abc = list('abcdefghijklmnopqrstuvwxyz') 

def r_trfa(): #True Or False (1/0) 
    x = random.randrange(0, 2) 
    return x; 

def r_kons(): #Konsonant 
    y = random.randrange(0, 20) 
    x = facts.kons[y] 
    return x; 

def r_vok(): #Vokal 
    y = random.randrange(0, 6) 
    x = facts.voks[y] 
    return x; 

def r_len(): #Langd 
    x = random.randrange(4, 8) 
    return x; 

def r_type(): 
    x = random.randrange(1, 4) 
    return x; 

def r_structure(length): #Skapar strukturen 
    y = r_type() 
    if y == 0: 
     no1 = 1 
    else: 
     no1 = 2 
    i = 0 
    x = [no1] 
    y = r_type() 
    if not no1 == y: 
     x.append(y) 
    while i < length: 
     y = r_type() 
     if not x[i] == y: 
      x.append(y) 
     i = i + 1 
    x2 = list(x) 
    return x2; 


def name(): #Final product 
    struct = r_structure(r_len()) 
    name = struct 
+1

Если вы получаете такие вещи, как 'aaaaa', это означает, что вы почти наверняка есть ошибка. – Antimony

+1

Что вы здесь делаете? –

+0

Пример ввода и вывода, пожалуйста. Если вы это сделаете, вы, вероятно, тоже столкнетесь с некоторыми документами. Что хорошо. – Droogans

ответ

0

У вас есть несколько ошибок. Например, вы проверяете значение y против 0, хотя оно всегда находится в диапазоне 1-4, вероятно, непреднамеренное поведение. Кроме того, вы никогда не называете функцию, которая дает вам символ, и вы никогда не создаете строку. Таким образом, неясно, что вы пытаетесь сделать.

Вот как я переписал вещи, основываясь на моих предположениях о том, что вы хотите сделать.

import random, itertools 

voks = frozenset('aeiouy') 
abc = 'abcdefghijklmnopqrstuvwxyz' 

def r_gen(): 
    last=None #both classes ok 
    while 1: 
     new = random.choice(abc) 
     if (new in voks) != last: 
      yield new 
      last = (new in voks) 

def name(): #Final product 
    length = random.randrange(4, 8) 
    return ''.join(itertools.islice(r_gen(), length)) 
+0

Вы не должны поощрять OP использовать немецкое слово для 'vowel' в качестве имени переменной. – Droogans

+0

Woaw, спасибо, этот код действительно работал как шарм! @Droogans Его короткие и понятные, так почему бы и нет? : D – Fr3ak

+0

Посмотрите [Раздел 5.2 по стандарту кодирования GNU] (https://www.gnu.org/prep/standards/standards.html#Comments): * Пожалуйста, напишите комментарии в программе GNU на английском языке, потому что английский это единственный язык, который могут читать почти все программисты во всех странах. Если вы не хорошо пишете английский язык, напишите комментарии на английском языке, а также вы сможете, а затем попросите других людей переписать их. Если вы не можете писать комментарии на английском языке, пожалуйста, найдите кого-нибудь, чтобы работать с вами и перевести ваши комментарии на английский язык.* Это считается хорошей практикой, даже для программ, отличных от GNU. – Droogans

0

Проблема у Вас есть то, что приросты ваших петель i всегда, но только добавляет дополнительную ценность для вашего x списка, если случайная величина не соответствует x[i]. Это означает, что если вы получите несколько совпадений подряд, i может стать больше, чем самый большой индекс в x, и поэтому вы получите исключение IndexError.

Я не совсем уверен, что я понимаю, что вы пытаетесь сделать, но я думаю, что это будет делать что-то похожее на текущей r_structure функции:

def r_structure(length): 
    """Returns a list of random "types", avoiding any immediate repeats""" 
    x = [r_type()] 
    while len(x) < length: 
     y = r_type() 
     if y != x[-1]: # check against the last item in the list 
      x.append(y) 
    return x 

Если ваша цель состоит в том, чтобы просто случайным образом генерировать последовательность чередующихся гласных и согласных, есть более простой способ, чем то, что вы, кажется, делаете. Во-первых, вы можете использовать random.choice, чтобы выбрать своих персонажей. Кроме того, вместо того, собирание много писем и отвергая те, которые имеют неправильный тип, вы можете просто выбрать из одной строки, а затем выбрать из другого, так долго, как вам нужно:

import random 

def alternating_characters(length): 
    characters = ["aeiouy", "bcdfghjklmnpqrstvwxz"] 
    char_type = random.randrange(2) # pick a random letter type to start with 
    results = [] 

    while len(char_list) < length: 
     results.append(random.choice(characters[char_type])) # pick random char 
     char_type = 1-char_type # pick from the other list next time 

    return "".join(char_list) 
0

Ну это неясно, что вам хочу делать. Поскольку условия на гласных и согласных одинаковы, почему вы должны различать их?

Итак, все, что вам нужно сделать, это взять случайную букву и проверить, что она не совпадает с последней буквой. Вот код:

import random 

abc = 'abcdefghijklmnopqrstuvwxyz' 
def gen_word(length): 
    last = '' 
    while length > 0: 
     l = random.choice(abc) 
     if l != last: 
      length -= 1 
      yield l 

if __name__ == '__main__': 
    word = ''.join(gen_word(10)) 
    print word