【问题标题】:Create a dictonary with a list as key [duplicate]创建一个以列表为键的字典[重复]
【发布时间】:2022-01-07 15:32:43
【问题描述】:

是否可以创建一个这种风格的字典,以便稍后提供指向模型的链接:

Pre = {['g1_i1', 'bd1']: ['i1_i2', 'i2_i1'], ['g1_i1', 'g2']: ['i1_i2', 'i2_i1'], ...}

我的错误代码:

Pre = dict(zip(r, Pre_arr))
TypeError: unhashable type: 'list'

到目前为止,这是我的代码,但我遇到的问题是 zip 和 dict 在这种情况下不起作用。您是否知道创建上述 dict 的任何其他方式或以这种方式传递值的类似方法?

links = ['g1_i1', 'i1_g1', 'bd1_i2', 'i2_bd1', 'g2_i3', 'i3_g2', 'i1_i2', 'i2_i1', 'i2_i3', 'i3_i2', 'i1_i5', 'i5_i1',
     'i3_i4', 'i4_i3', 'i4_i5', 'i5_i4', 'i4_p2', 'p2_i4', 'i5_p1', 'p1_i5']

psu = ['g1', 'g2', 'bd1']

Pre_arr = [['i1_i2', 'i2_i1'], ['i2_i3', 'i3_i2'], ['g1_i1', 'i1_g1'], ['i1_i2', 'i2_i1'], ['g1_i1', 'i1_g1'], ['i1_i2', 'i2_i1'], ['i2_i3', 'i3_i2'], ['i1_i2', 'i2_i1'], ['i2_i3', 'i3_i2'], ['i3_i4', 'i4_i3'], ['i2_i3', 'i3_i2'], ['i3_i4', 'i4_i3'], ['i4_i5', 'i5_i4'], ['i3_i4', 'i4_i3'], ['i4_i5', 'i5_i4'], ['i5_i6', 'i6_i5'], ['i4_i5', 'i5_i4'], ['i3_i4', 'i4_i3'], ['i4_i5', 'i5_i4'], ['i5_i6', 'i6_i5'], ['i2_i1', 'i1_i2'], ['i2_i3', 'i3_i2'], ['i2_i1', 'i1_i2'], ['g2_i2', 'i2_g2'], ['g2_i2', 'i2_g2'], ['g2_i2', 'i2_g2'], ['i2_i3', 'i3_i2'], ['g2_i2', 'i2_g2'], ['i2_i3', 'i3_i2'], ['i3_i4', 'i4_i3'], ['i2_i3', 'i3_i2'], ['i3_i4', 'i4_i3'], ['i4_i5', 'i5_i4'], ['i3_i4', 'i4_i3'], ['i4_i5', 'i5_i4'], ['i5_i6', 'i6_i5'], ['i4_i5', 'i5_i4'], ['i3_i4', 'i4_i3'], ['i4_i5', 'i5_i4'], ['i5_i6', 'i6_i5'], ['i2_i1', 'i1_i2'], ['i3_i2', 'i2_i3'], ['i2_i1', 'i1_i2'], ['i3_i2', 'i2_i3'], ['i3_i2', 'i2_i3'], ['i3_i2', 'i2_i3'], ['bd1_i3', 'i3_bd1'], ['bd1_i3', 'i3_bd1'], ['bd1_i3', 'i3_bd1'], ['i3_i4', 'i4_i3'], ['bd1_i3', 'i3_bd1'], ['i3_i4', 'i4_i3'], ['i4_i5', 'i5_i4'], ['i3_i4', 'i4_i3'], ['i4_i5', 'i5_i4'], ['i5_i6', 'i6_i5'], ['i4_i5', 'i5_i4'], ['i3_i4', 'i4_i3'], ['i4_i5', 'i5_i4'], ['i5_i6', 'i6_i5']]

r = []
w =[]
for i in links:
    w += i.split('_')
#print(w)

for j in range(0, len(w), 2):
    l2 = list((w[j], w[j+1]))
    for i in psu:
        if w[j] == i or w[j+1] == i:
            pass
        else:
            m = ('_'.join(l2))
            r.append([m, i])
Pre = dict(zip(r, Pre_arr))

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    列表是可变的,因此不可散列。

    我建议使用不可变的元组,如果它包含不可变的元素,那么它可以是可散列的。

    见:List unhashable, but tuple hashable?

    【讨论】:

      【解决方案2】:

      字典键必须是不可变的 (https://realpython.com/lessons/restrictions-dictionary-keys-and-values/),而列表是可变对象。

      在 for 循环中,您可以附加元组而不是列表,因为它们是不可变的

      for j in range(0, len(w), 2):
      l2 = list((w[j], w[j+1]))
      for i in psu:
          if w[j] == i or w[j+1] == i:
              pass
          else:
              m = ('_'.join(l2))
              r.append((m, i))
      Pre = dict(zip(r, Pre_arr))
      

      【讨论】:

        猜你喜欢
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        • 2018-08-22
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多