2017-09-11 7 views
0

ループの結果をセットに追加するための関数を書こうとしています。基本的にはリストをとり、set()を使って重複する文字を取り除きます。リスト内の文字列文字列のリストをセットのリストに変換するときのAttributeError

ただし、私がコードを実行するたびに、.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 = ["りんご"、 "バナナ"、 "ニンジン"]を私が新しいリスト[{'a'、 'p'、 '

+0

あなたの質問に十分に回答があった場合は、回答を[同意する](https://stackoverflow.com/help/someone-answers)できます。ありがとう。 –

答えて

2

listsetsの代わりになるように思われます。どのようにしたらいいですか? :ループの外

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 ionary)を作成します。逆アセンブルバイトコードを見てみましょう。対比:

>>> dis.dis("set()") 
    1   0 LOAD_NAME    0 (set) 
       3 CALL_FUNCTION   0 (0 positional, 0 keyword pair) 
       6 RETURN_VALUE 
関連する問題