将字符串列表转换为集合列表时的AttributeError

时间:2017-09-11 04:29:00

标签: python string list set attributeerror

我尝试编写一个函数来将循环结果添加到集合中,基本上采用一个列表并使用set()取出列表中字符串中的任何重复字母。

然而;每当我运行代码时,我都会遇到一个错误,说明.add不是dict的定义。

def make_itemsets(L):
    item_set = {}
    for item in L:
        item_set.add(set(item))
        return item_set


      2     item_set = {}
      3     for item in L:
----> 4         item_set.add(set(item))
      5         return item_set
      6 

AttributeError: 'dict' object has no attribute 'add'

有什么想法吗?我基本上试图获得这个列表(L = ["苹果","香蕉","胡萝卜"]来运行我的功能I&#39 ;已创建以返回新列表[{' a',''' l',' e'' s'},{' b'' a'' n''}等等。]

1 个答案:

答案 0 :(得分:2)

您似乎想要list代替sets。怎么样:

def make_itemsets(L):
    items = []
    for item in L:
        items.append(set(item))

    return items

注意循环外的return语句。使用列表理解的较短版本需要:

def make_itemsets(L):
    return [set(item) for item in L]

或者,使用map的更短版本:

def make_itemsets(L):
    return list(map(set, L))

如果你在python2上,你可以删除list(...)。调用这些函数中的任何一个都会返回:

>>> s = make_itemsets(["apples","bananas","carrot"])
>>> s
[{'a', 'e', 'l', 'p', 's'}, {'a', 'b', 'n', 's'}, {'a', 'c', 'o', 'r', 't'}]

作为参考,如果您尝试创建空集,则需要

item_set = set()

{}碰巧创建了一个空的dict。看一下反汇编的字节码:

>>> dis.dis("{}")
  1           0 BUILD_MAP                0
              3 RETURN_VALUE

0 BUILD_MAP stmt创建一个地图(又名dict离子)。对比:

>>> dis.dis("set()")
  1           0 LOAD_NAME                0 (set)
              3 CALL_FUNCTION            0 (0 positional, 0 keyword pair)
              6 RETURN_VALUE