0
fruits = [{'apple', 'banana', 'berry'}, 
          {'strawberry', 'orange'}]
fruit_dict = {}    
group_id = 0
while group_id < len(fruits):
    for fruit in fruits:    
        fruit_dict[fruit] = group_id
    group_id += 1

我正在尝试创建一个字典,我可以在其中将组 ID 分配给集合“水果”的列表。但我不断地 TypeError: unhashable type: 'set'离队for fruit in fruits:。预期输出:

fruit_dict = { {'apple', 'banana', 'berry'}: 0, 
          {'strawberry', 'orange'}: 1 }
4

2 回答 2

1

正如错误所暗示的,sets 不可散列,因此不能用作字典键。您可以使用其他可散列类型,例如frozensets 或tuples。然后你只需要转换你的集合,你可以很容易地做到这一点(而不是在循环enumerate中维护一个索引):while

fruit_dict = {}    

for group_id, fruit in enumerate(fruits):
    fruit_dict[frozenset(fruit)] = group_id

或者只是一个 dict-comp:

fruit_dict = {frozenset(fruit): group_id for group_id, fruit in enumerate(fruits)}
于 2020-11-04T12:49:15.803 回答
0

set对象是不可散列的。要将集合用作字典键,您需要使用frozenset,它们就像集合一样,除了它们是不可变的和可散列的。

此外,您的 while 循环不会执行您希望它执行的操作。你会想enumerate改用。

fruits = [{'apple', 'banana', 'berry'},
          {'strawberry', 'orange'}]
fruit_dict = {}
for i, fruit in enumerate(fruits):
  fruit_dict[frozenset(fruit)] = i

现在打印fruit_dict将为您提供以下输出:

{frozenset({'berry', 'banana', 'apple'}): 0, frozenset({'orange', 'strawberry'}): 1}

不完全按照您的要求,但只要您不尝试修改字典键,它应该可以正常工作。

于 2020-11-04T12:48:59.873 回答