【问题标题】:When I create a nested dictionary from a list, why is the length of my dictionary shorter than that of each list?当我从列表创建嵌套字典时,为什么我的字典长度比每个列表的长度都短?
【发布时间】:2018-03-31 16:25:24
【问题描述】:

我创建了一个脚本来处理导出为 .txt 文件的 3 列 excel 文件中的每个项目到 3 个列表(每列 1 个列表)。 .txt 文件中有 22 行,包括标题。使用这 3 个列表,我正在尝试创建一个嵌套字典,其中每一列都是一个键、一个值中的键或一个值中的值(即:{Tag1:{Tag2:Tag3}...}列表中有很多项目。

当我将这些列表压缩到嵌套字典中时,它会截断列表并仅将 19 个项目压缩到字典中,而不是 22 个。有人可以对我的代码进行故障排除,看看字典对我的列表做了什么吗?

这是 .txt 文件供参考:

这是我的脚本:

import glob
source_file = glob.glob('file_path/test.txt')[0]
time = []
code = []
identifier = []
data_set = {}


for line in open (source_file,'r'):
  line_split = line.split('\t')
  tag_3 = line_split[-1].replace('\n','')
  tag_2 = line_split[1]
  tag_1 = line_split[0]

  time.append(tag_3)
  code.append(tag_2)
  identifier.append(tag_1)

data_set = {a:{b:c} for a,b,c in zip(identifier, code, time)}

编辑:这里是文件可下载版本的链接:https://drive.google.com/file/d/0B2s43FKt5BZgQldULXVOR0RBeTg/view?usp=sharing

编辑 2:这应该是所需的输出:

data_set = {
'Tag1':{'Tag2':'Tag3'},
'0.1M':{'20':'10'},
'0.1MCD':{'2':'1'},
'0.25M':{'17':'1'},
'0.25MC':{'18':'1'},
'0.5MCN':{'16':'1'},
'0.MCD8':{'15':'1'},
'10':{'36':'5'},
'1029':{'75':'17'},
'1029A':{'22':'15'},
'1029B':{'49':'18'},
'1029BCD':{'23':'15'},
'1029BCDA':{'27':'18'},
'109B8N':{'63':'10'},
'1193D4M':{'51':'16'},
'1193D4N':{'2':'11'},
'1193D8M':{'17':'16'},
'11938N':{'25':'12'},
'1193CD4M':{'53':'16'},
'1193CD4N':{'83':'13'},
'118M':{'20':'16'},
'1193BCN':{'16':'7'},

}

编辑 3:事实证明,如果列表中有重复值,字典会截断该值。有没有办法避免这种情况?

【问题讨论】:

  • 您可以将文件以文本形式发布,以便人们进行调试吗?
  • 读取文件时为什么不创建dict?也不要重新定义内置的dict名称

标签: python list dictionary append


【解决方案1】:

你可以试试这个:

s = [b for b in [i.strip('\n').split()  for i in open('file.txt')] if b]
final_data = {a:{b:c} for a, b, c in s}

输出:

{'1029BCDA': {'27': '18'}, '1029BCD': {'23': '15'}, '0.25M': {'17': '1'}, '118M': {'20': '16'}, '0.1M': {'20': '10'}, '11934D4N': {'83': '13'}, '0.5MCD8': {'15': '1'}, '1193D8M': {'17': '16'}, '1193CD4M': {'53': '16'}, '109B8N': {'63': '10'}, '10': {'36': '5'}, '1193D4M': {'51': '16'}, '1193D4N': {'2': '11'}, '0.1MCD': {'2': '1'}, '1193BCN': {'16': '7'}, '0.25MC': {'18': '1'}, '11938N': {'25': '12'}, '0.5MCN': {'16': '1'}, 'Tag1': {'Tag2': 'Tag3'}, '1029': {'75': '17'}, '1029A': {'22': '15'}, '1029B': {'49': '18'}}

编辑:使用collections.defaultdict 正确处理重复值:

from collections import defaultdict
d = defaultdict(list)
for a, b, c in s:
   d[a].append({b:c})

【讨论】:

  • 当我插入您的代码时,我收到一个错误代码,上面写着“太多的值无法解压”
  • @superasiantomtom95 请从文件中发布您想要的输出。
  • @superasiantomtom95 另外,我做了一些更改,让我知道它现在是如何工作的。
  • 它仍然说有太多的值需要解压(参考你提供的第二行代码)。不知道我到底怎么了
  • 实际上,如果我在文件上运行我的普通脚本,它就可以正常工作。但是,当我在 tag1 列中有重复值时,问题就出现了。 Python 似乎覆盖了重复的值。有没有办法防止这种情况发生?
【解决方案2】:

字典不能有重复的键。您可以做的是定义字典来保存值列表。在您的情况下,将 {Tag1:{Tag2:Tag3}} 更改为 {Tag1:[{Tag2:Tag3}]}

【讨论】:

    【解决方案3】:

    你想要的东西叫做“包”。试试collections.Counter 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2021-09-15
      相关资源
      最近更新 更多