【问题标题】:Error when transforming (and reversing) Tuple Tuple to dict将元组元组转换(和反转)为字典时出错
【发布时间】:2021-11-13 15:17:21
【问题描述】:

我正在尝试将以下元组元组转换为一个字典(以及其中一个反转的字典):

EDIT_TUTORING_PLACES_CHOICES_TRANSLATOR = (
  (AT_STUDENT, ['1']),
  (AT_TUTOR, ['2']),
  (ONLINE, ['3']),
  (AT_STUDENT_AND_TUTOR, ['1', '2']),
  (AT_STUDENT_AND_ONLINE, ['1', '3']),
  (AT_TUTOR_AND_ONLINE, ['2', '3']),
  (ALL, ['1', '2', '3']),
  
)

这是我使用的代码:

dict = {v: k for k, v in list(EDIT_TUTORING_PLACES_CHOICES_TRANSLATOR)}

我收到以下错误:

TypeError: unhashable type: 'list'

我应该怎么做?非常感谢!

【问题讨论】:

  • 你想做什么?如果任务只是创建字典,dict(EDIT_TUTORING_PLACES_CHOICES_TRANSLATOR) 应该可以工作。另一个问题是,如果您需要字典,为什么要初始化元组..
  • Olvin Roght,我想要反转
  • 那么您应该阅读错误消息。字典的键应该是可散列的。您可以将列表转换为可散列的元组。
  • 没错,我发了一个答案

标签: python string dictionary tuples key


【解决方案1】:

dict 会有一个列表作为键,这是不可能的。 我用嵌套的 if/else 语句解决了这个问题:

def tutor_place_array_to_int(arr: list[str]):
  if arr.count('1') > 0:
    if arr.count('2') > 0:
      if arr.count('3') > 0:
        return ALL
      else:
        return AT_STUDENT_AND_TUTOR
    else:
      if arr.count('3') > 0:
        return AT_STUDENT_AND_ONLINE
      else:
        return AT_STUDENT
  else:
    if arr.count('2') > 0:
      if arr.count('3') > 0:
        return AT_TUTOR_AND_ONLINE
      else:
        return AT_TUTOR
    else:
      if arr.count('3') > 0:
        return ONLINE

  return None

ALL、AT_STUDENT_AND_TUTO 等都是表示整数的常量

【讨论】:

  • 导师/学生匹配应用程序的一部分 ;)
  • 这么多问题..这个函数的最终目的是什么?你怎么称呼它?
  • 从我存储常量的同一个地方导入,目的:将前端发送的数据转换成后端存储的格式
  • 问题是“你怎么称呼它?”。给我调用这个函数的代码行。
  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

你是对的,列表不能用作 python dict 中的键,因为键必须是不可变的。 但是,您可以使用元组而不是列表来归档您的目标(因为元组是不可变的) 要创建您的字典,请使用

tutor_place_array_to_int_map = {tuple(v): k for k, v in list(EDIT_TUTORING_PLACES_CHOICES_TRANSLATOR)}

这样你在 dict 中的键是不可变的元组,然后你就可以使用:

sth = tutor_place_array_to_int_map[("1", "2")]
sth = tutor_place_array_to_int_map.get(("1", "2"))
sth = tutor_place_array_to_int_map.get(tuple(["1", "2"]))

等等

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2021-03-13
    相关资源
    最近更新 更多