【问题标题】:why does my list of lists convert to dictionary only partly?为什么我的列表仅部分转换为字典?
【发布时间】:2023-04-10 08:55:01
【问题描述】:

让我们调用我的列表 tempList。它具有以下 1000 行的结构,显然没有括号:

['foo', u'18,206,600']
['a', u'18,052,573']
['ta', u'17,870,276']
['sc', u'17,792,892']
['wo', u'17,736,288']
['pis', u'17,721,111']

现在我执行下面的代码,希望左边的元素是键,右边的元素是每一行的值:

subsDict = dict(tempList)

并得到一个字典,它的大小只是 tempList 大小的一部分。少数字典元素的顺序是完全打乱的,而不是像 tempList 中那样降序。我也尝试了建议的解决方案here。 我错过了什么?

编辑:这是输出的一部分:

Fitness   :   6,209,230
fffffffuuuuuuuuuuuu   :   782,908
rickandmorty   :   669,563
dataisbeautiful   :   12,447,856
relationships   :   830,326
GlobalOffensive   :   552,751
Showerthoughts   :   13,017,249
blog   :   16,064,085
woahdude   :   1,424,895

【问题讨论】:

  • 您的keys 在数据集中不是唯一的 - 您想成为每个键的列表还是...?
  • 请举例说明输出的一部分——不清楚你得到了什么或预期会发生什么。
  • 您的代码看起来不错,因为我无法在我的机器上复制此错误。
  • @artre 好吧...是您的实际 tempList 类似于:[['a', u'something'], ['b',u'something else']] - 所以它绝对是 2 项的迭代,第一项绝对是唯一的?
  • @JonClements 是的。每行的第一个值是唯一的。我很确定

标签: python list dictionary


【解决方案1】:

您的密钥绝对不是唯一的。要确认这一点,请执行以下操作:

keys = [x[0] for x in tempList]
print(len(keys), len(set(keys))

它们应该不同,后者更小。现在,通过阅读您的问题,您似乎想要两件事:

  1. 订购
  2. 保留您的所有价值观

这两个要求的答案是使用OrderedDict 的列表。


from collections import OrderedDict

subDict = OrderedDict()
for x in tempList:
    subDict.setdefault(x[0], []).append(x[1])

【讨论】:

  • 好的,我做了上面的测试。 len(keys) 给我 1000,len(set(keys)) 给我 125。
  • @artre 现在应该很清楚,您的密钥不是唯一的...在 1000 个中,您只有 125 个唯一的密钥。
  • 好的。我明白。尽管在输出中我看不到任何重复项,但它们似乎都是唯一的密钥 ID。这很奇怪。我必须回到上一步,看看我在创建列表时做错了什么。
  • @artre 或者你可以像我的回答一样使用 OrderedDict? ;-)
  • 我想我可以 :-)) 。我只是想在我的“看似正确”的代码中找到错误。
猜你喜欢
  • 1970-01-01
  • 2017-04-23
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2018-08-21
  • 1970-01-01
相关资源
最近更新 更多