python错误'dict'对象没有属性:'add'

时间:2015-07-27 15:02:00

标签: python dictionary add

我编写此代码作为字符串列表中的简单搜索引擎,如下例所示:

Company:               Value
XYZ Incorperated       25
XYZ Company            40
XYZ                    12
ABC INC.               39
ABC inc.               10
ABC COMPANY            15

但我经常收到错误

mii(['hello world','hello','hello cat','hellolot of cats']) == {'hello': {0, 1, 2}, 'cat': {2}, 'of': {3}, 'world': {0}, 'cats': {3}, 'hellolot': {3}}

我该如何解决?

'dict' object has no attribute 'add'

4 个答案:

答案 0 :(得分:5)

在Python中,当您将对象初始化为word = {}时,您正在创建一个dict对象而不是set对象(我假设它是您想要的)。要创建集合,请使用:

word = set()

你可能对Python的Set Comprehension感到困惑,例如:

myset = {e for e in [1, 2, 3, 1]}

导致set包含元素1,2和3.类似Dict理解:

mydict = {k: v for k, v in [(1, 2)]}

会生成一个包含键值对1: 2的字典。

答案 1 :(得分:0)

def mii(strlist):
    word_list = {}
    for index, str in enumerate(strlist):
        for word in str.split():
            if word not in word_list.keys():
                word_list[word] = [index]
            else:
                word_list[word].append(index)
    return word_list

print mii(['hello world','hello','hello cat','hellolot of cats'])

输出:

{'of': [3], 'cat': [2], 'cats': [3], 'hellolot': [3], 'world': [0], 'hello': [0, 1, 2]}

我认为这就是你想要的。

答案 2 :(得分:0)

我在你的功能中看到很多问题 -

  1. 在Python中{}是一个空字典,而不是一个集合来创建一个集合,你应该使用内置函数set()

  2. if条件 - if str2 in word==False:由于操作符链接而永远不会为True,它将转换为 - if str2 in word and word==False,示例显示此行为 -

    >>> 'a' in 'abcd'==False
    False
    >>> 'a' in 'abcd'==True
    False
    
  3. 在行 - for (n,m) in list(enumerate(strlist)) - 你不需要将enumerate()函数的返回值转换为list,你可以迭代它的返回值(直接是迭代器)

  4. 设置没有任何顺序感,当你这样做时 - zip(word,index) - 无法保证元素按照你想要的正确顺序压缩(因为它们没有任何顺序感在所有)。

  5. 请勿将str用作变量名称。

  6. 鉴于此,你最好从一开始就直接创建字典,而不是设置。

    代码 -

    def mii(strlist):
        word={}
        for i, s in enumerate(strlist):
            for s2 in s.split():
                word.setdefault(s2,set()).add(i)
        return word
    

    演示 -

    >>> def mii(strlist):
    ...     word={}
    ...     for i, s in enumerate(strlist):
    ...         for s2 in s.split():
    ...             word.setdefault(s2,set()).add(i)
    ...     return word
    ...
    >>> mii(['hello world','hello','hello cat','hellolot of cats'])
    {'cats': {3}, 'world': {0}, 'cat': {2}, 'hello': {0, 1, 2}, 'hellolot': {3}, 'of': {3}}
    

答案 3 :(得分:0)

x = [1、2、3]是创建列表(可变数组)的文字。
x = []创建一个空列表。

x =(1、2、3)是创建元组(常量列表)的文字。
x =()创建一个空元组。

x = {1,2,3}是创建集合的文字。
x = {}令人困惑地创建了一个空字典(哈希数组),而不是一个集合,因为字典首先出现在python中。

使用
x = set()创建一个空集。

还请注意
x = {“ first”:1,“ unordered”:2,“ hash”:3}是一个文字,它创建了一个字典,只是用来混合内容。