【问题标题】:Converting a list to a dictionary in python在python中将列表转换为字典
【发布时间】:2022-01-02 02:03:44
【问题描述】:

我有一个 Python 列表,我想将其转换为字典。名单是:

l = [('1:', [362.5815, 162.5823]), ('2:', [154.1328, 354.133]), ('3:', [168.9325, 368.9331]), ('4:', [9.9201, 209.9206]), ('5:', [106.4842, 306.4844])]

dict 应该将整数 1,2,3,4,5 作为键,将列表作为值。我试过使用

def Convert(l):
    it = iter(l)
    res_dct = dict(zip(it, it))
    return res_dct  

def Convert(l):
    res_dct = {l[i]: l[i + 1] for i in range(0, len(l), 2)}
    return res_dct

但由于列表是不可散列的类型,因此这些不起作用。 我还能如何转换此列表?提前致谢

【问题讨论】:

  • 你的第二个例子几乎是正确的。但是您不希望 l[i] 作为键,因为那是一个元组。相反,您希望将元组的第一个元素 l[i][0] 作为键。
  • @Code-Apprentice - 我不这么认为。即使海报是l[i][0],它也是带有冒号的字符串,而不是整数,它会跳过所有其他列表项。
  • @tdelaney 是的,将l[i] 更改为l[i][0]l[i + 1] 更改为l[i][1] 只是解决问题的第一步。此更改将解决列表不可散列的直接错误。我的观点是 OP 正朝着正确的方向前进。
  • @Code-Apprentice - 但它不是正确的方向。当一个简单的迭代可以完成这项工作时,不应该使用范围 + 索引。第一个例子比第二个更靠近右边。
  • @tdelaney range() 不是 pythonic 并不意味着使用它根本不起作用。

标签: python list dictionary type-conversion


【解决方案1】:
def Convert(l):
    res_dct = {l[i]: l[i + 1] for i in range(0, len(l), 2)}
    return res_dct

这几乎是正确的。问题是 l[i] 是一个完整的元组作为键。相反,您需要该元组的第一个元素:l[i][0]。同样,该值需要为l[i][1] 才能获取每个元组的第二个元素。考虑到这一点,没有理由跳过列表中的所有其他元素。把它们放在一起:

def Convert(l):
    res_dct = {l[i][0]: l[i][1] for i in range(len(l))}
    return res_dct

一种更 Python 的方式是直接迭代列表的元素,而不是使用列表上的索引:

def Convert(l):
    res_dct = {i[0]: i[1] for i in l}
    return res_dct

你也可以使用更多的python语法来摆脱对元组的索引:

def Convert(l):
    res_dct = {k: v for k, v in l}
    return res_dct

但是dict() 类已经用一个对列表来做到这一点,所以我们可以进一步简化:

def Convert(l):
    res_dct = dict(l)
    return res_dct

所有这三种变体都会将元组列表变成字典。但是,他们将完全按原样使用元素。特别是,密钥将是一个带有数字的字符串,然后是一个冒号。如果要将它们的键修改为整数,则不能使用调用dict() 的最终版本。相反,我们将使用字典理解并将一些函数应用于键:

def Convert(l):
    res_dct = {int(k.strip(':')): v for k, v in l}
    return res_dct

毕竟,我会考虑只列出一个列表。当键按顺序排列时,列表比字典更有意义:

def Convert(l):
    res = [v for k, v in l]
    return res

密钥由列表为您处理。这假设原始元素已经有序。

【讨论】:

  • 非常感谢您的解释。将键作为整数返回的版本是完美的!
【解决方案2】:
d = dict()   
for (k, v) in l:
    d[k.strip(':')] = v

请注意列表中的重复键,因为只会保留最后一个列表,如果您希望重复键,您需要决定以不同方式处理它们的策略(例如合并它们或保留第一个分配而不是最后一个分配此处实施的分配)

编辑 在下面注释掉 dict 理解和键的 int 转换时,也可以这样做(虽然对易读性不太确定)

{int(key.strip(':')):value for (key,value) in l}

【讨论】:

  • 我认为你需要在te中添加一个int(..),否则它们只是字符串。
  • 你可以用字典理解把它减少到一行。
  • 好答案,但您可以添加备用 d = {int(v[0].strip(":")):v[1] for v in l} 作为字典理解,我认为这将是一个典型的 python 解决方案。
【解决方案3】:

您可以使用字典理解和枚举

{i: v[1] for i,v in enumerate(l, 1)}

【讨论】:

  • 这假设整数总是 1, 2, 3, ... 如果数据不是这个,它将失败。我认为你在这里假设太多了。
  • @tdelaney - 可能但操作也说“字典应该有整数 1,2,3,4,5 作为键和列表作为值”所以元组的当前第一个元素可以同样容易被误导
  • 但这只是因为示例中有“1:”等...我们不知道这是规则还是仅此一个示例。在我们知道之前,它更像是对 OP 的一个问题,而不是一个答案。
  • 使用enumerate() 假定输入列表的顺序已经正确。使用每个元组的第一个元素来获取键更安全。
  • @Code-Apprentice - 如果这就是 OP 的意图,我会同意,我的解释略有不同,例如对 ops 原始列表进行了排序,他们可能会将其转换为“等级”字典即1st 2nd 3rd,而不是用于排序的值(基于“应该有整数1,2,3,4,5”)
猜你喜欢
  • 1970-01-01
  • 2015-07-23
  • 2014-07-28
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多