2017-02-21 17 views
1

У меня есть следующий список кортежей:Set понимание дает «unhashable типа» (набор списка) в Python

list_of_tuples = [('True', 100, 'Text1'), 
        ('False', 101, 'Text2'), 
        ('True', 102, 'Text3')] 

Я хочу, чтобы собрать все вторые элементы каждого набора в набор:

my_set = set() 
my_set.add({tup[1] for tup in list_of_tuples}) 

Но выдает следующее сообщение об ошибке:

TypeError: unhashable type: 'set' 

Когда я распечатать соответствующие элементы в итерации, он показывает, что т он в результате набора понимает не ожидаемые скаляры, а списки:

print {tup[1] for tup in list_of_tuples} 

set([100, 101, 102]) 

Почему это происходит? Почему это сначала помещает элементы в список и помещает затем список в набор без каких-либо намеков? Как я могу исправить свое решение?

+1

Вы здесь добавили * наборы * в * наборы * ... –

ответ

2

Отдельные элементы, которые вы помещаете в набор, не могут быть изменчивыми, потому что если они изменились, эффективный хеш изменится, и возможность проверки на включение сломается.

Содержание set может быть изменено в течение срока его действия. Это незаконно.

Так что просто пытаются использовать это:

list_of_tuples = [('True', 100, 'Text1'), 
        ('False', 101, 'Text2'), 
        ('True', 102, 'Text3')] 


my_set= { tup[1] for tup in list_of_tuples } 
# set comprehensions with braces 
print my_set 

Надеются, что это помогает.

1

Вы определяете пустой набор, а затем пытаетесь добавить в него еще один набор. Вместо этого просто создайте набор напрямую:

my_set = {tup[1] for tup in list_of_tuples} 

И результат вашей печати - это то, как Python представляет множества; он не показывает вам, что есть список, он показывает вам набор, состоящий из 100, 101 и 102.

Смежные вопросы