2017-07-11 21 views
-4

一組のユニークなリストアイテムを保持するセットがあります: これは私がそれを定義しようとしている方法です。重複するリストを削除しますか?

results = set([], key= self.comparator) 

これは私がいない場合は

TypeError: set() does not take keyword arguments 

明らかセットのコンストラクタは、キー、 を受け入れていない、

def comparator(self, l1, l2): 
    if len(l1) != len(l2): 
     return -1 
    i = 0 
    while i < len(l1): 
     if l1[i] != l2[i]: 
      return -1 
     i += 1 
    return 0 

これは、次のエラーをスローし、コンパレータ機能でありますキーを渡すと、次のエラーが表示されます。

TypeError: unhashable type: 'list' 

したがって、重複するリストを排除しようとしている方法は機能しません。 Pythonでどうすればいいですか?

+8

なぜ 'set'コンストラクタがキーを受け入れると思いましたか? –

+0

Setは、リストなどの反復可能な単一の引数だけを受け入れますが、他の引数は受け入れられません。 –

+3

リストをセットに格納することはできません。タプルを試してみてください。 – ayhan

答えて

2

あなたがやりたいタプルにあなたのリストを変換することができます:

my_lists = [[1,2,3], [1,2], [1,2,3]] 
tuples = [tuple(l) for l in my_lists] 

print(set(tuples)) 

はあなたが必要なものを達成するためのようです。

プリント:

set([(1, 2), (1, 2, 3)]) 
+1

これは、 'uniques = set(my_listsのlのためにtuple(l))'に短絡される可能性があります。 –

2

あなたが考え出したように、setはこのようなキーを受け付けません。しかし、それは実際には__hash__()メソッドを持っていることを意味する "ハッシュ可能"であることをアイテムとして持っているものを期待しています。この例からもわかるようlist sが、作業ハッシュを持っていない:

a = 'a' 
a.__hash__() # prints -8546348471933684759 
a = [1,2,3] 
a.__hash__() # will throw TypeError 

あなたはリストのように動作しますが、それの価値観に基づいた独自のハッシュ値を持つ新しいクラスを定義した場合、あなたは使用することができますそれにはsetがあります。

class mylist(list): 
    def __hash__(self): 
     return sum(item.__hash__() for item in self) 

a = mylist([1,2,3]) 
b = mylist([1,2,3]) 
c = mylist([4,5,6]) 
unique_lists = set((a,b,c)) 
print(unique_lists) # prints {[1, 2, 3], [4, 5, 6]} 
関連する問題