“NoneType”类型的对象没有len()Python

时间:2013-07-21 05:11:21

标签: python dictionary

我一直在python中尝试使用dicts,所以我可以删除'魔术数字',因为我认为它们被引用但是我一直得到错误:'NoneType'类型的对象没有len()。它只发生在我的刽子手程序中的某些时间,我不确定为什么。这是我认为崩溃的一般区域:

animals = 'ape bear beaver cat donkey fox goat llama monkey python bunny tiger wolf'.split()
colors = 'yellow red blue green orange purple pink brown black white gold'.split()
adjectives = 'happy sad lonely cold hot ugly pretty thin fat big small tall short'.split()
names = {'animals': animals, 'colors': colors, 'adjectives': adjectives}
categories = [names['animals'],names['colors'],names['adjectives']]

def getRandomWord(wordList):
    wordList = random.choice(list(names.keys())) 
    wordIndex = random.randint(0,len(wordList))
    print(animals[wordIndex])

    if(random.choice(list(names.keys())) == 'animals'):
        print("The category is animals!")
        return animals[wordIndex]
    if(random.choice(list(names.keys())) == 'colors'):
        print("The category is colors!")
        return colors[wordIndex]    
    if(random.choice(list(names.keys())) == 'adjectives'):
        print("The category is adjectives!")
        return adjectives[wordIndex]

我该怎么做才能解决问题?

1 个答案:

答案 0 :(得分:3)

现在,你正在画三次不同的类别。第一次将它与'animals'进行比较;第二个'colors';第三个是'adjectives'

但是,如果您再次提取'colors'然后'animals'然后又'colors'呢?你的三个“if”分支都不会触发。由于没有执行return,因此最后会有效return None

或者,如果您的names不是您认为的那样,那么您可能会绘制None值,我猜:您没有显示整个堆栈跟踪,所以我猜关于错误出现的地方。

(另外,您的wordIndex可能设置为len(wordList),这会导致IndexError,因为最后一个索引是len(wordList)-1。此外,由于wordIndex没有不一定来自与该类别相关联的列表,您也可能在那里有索引错误。)

我认为您可以将代码简化为:

import random
animals = 'ape bear beaver cat donkey fox goat llama monkey python bunny tiger wolf'.split()
colors = 'yellow red blue green orange purple pink brown black white gold'.split()
adjectives = 'happy sad lonely cold hot ugly pretty thin fat big small tall short'.split()
names = {'animals': animals, 'colors': colors, 'adjectives': adjectives}

def getRandomWord(words_by_category):
    category = random.choice(list(words_by_category.keys()))
    print("the category is", category)
    wordlist = words_by_category[category]
    chosen_word = random.choice(wordlist)
    return chosen_word

之后我们有:

>>> getRandomWord(names)
the category is colors
'blue'
>>> getRandomWord(names)
the category is adjectives
'happy'
>>> getRandomWord(names)
the category is colors
'green'
>>> getRandomWord(names)
the category is animals
'donkey'