另一个带有python的IndexError

时间:2013-05-11 03:23:16

标签: python random

这应该成为一个随机的名称生成器,所有的随机部分都在工作。唯一的问题是它真的是随机的,得到像aaaaaaaa等奇怪的东西。 所以我试图添加一个规则到允许2个元音相继(与辅音相同)。

所以是的,伙计们请帮助我。我一直在寻找这段代码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

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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)

答案 2 :(得分: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