首页 > 解决方案 > 在Python中将值列表传递到字典中

问题描述

我有一个包含名称和数字列表的 .txt 文档,并试图将它们传递到键/值对中的字典中。值列表看起来像这样(它是键/值对的垂直列表,其间有 \n 新行):

文件名:“demo.txt” 内容:

Brandon: 115.5
James: 128.87
Joel:
Luke:

Sarah: 827.43
Brandon: 100
Jimmy: xyz
Sue: -153
Sue: 100
Fred: x1y2
This
Should
Not
Get
Included

// 对于空格和非数字值,我试图跳过它们——否则,如果字典中已经存在该名称,我想更新该值。我已经尝试了以下方法,但希望得到一些建议:

d = {}

lst = []

f = open("demo.txt", "r")

lines = f.readlines()

f.close()


for line in lines:
    lst.append(line.strip().split())


for i in lst:
    if len(i) < 2:
        lst.remove(i)
    else:
        continue

for i in lst:
    try:
        i[0] = i[0][:-1]
    except:
        lst.remove(i)

for i in lst:
    try:
        if len(i) < 2:
            lst.remove(i)
        else:
            i[1] = float(i[1])
    except:
        lst.remove(i)

for i in lst:
   key = i[0]
   value = float(i[1])
   if key in d:
       existing_value = d.get(key)
       value = float(existing_value) + float(value)
       d.update({key: value})
   else:
      d[key] = value

print(d)

标签: pythondictionary

解决方案


我会做这样的事情:

d = {}

for line in open("demo.txt"):
    if ':' in line:
        key, value = line.split(":")

        try:
            d[key] = float(value.strip())
        except ValueError:
            pass

它会跳过任何没有:字符的行。否则,它将该行拆分为一个键(在 之前:)和一个值(在 之后:),并尝试将值转换为浮点数。如果失败,它会继续下一行。如果成功,它要么在字典中创建一个新密钥,要么更新现有密钥。

在建议方面,有几点说明:

  1. 您使用空白except而不指定要捕获的错误类型。这是不好的做法。您通常应该只捕获您期望的错误类型。至少,except Exception它会捕获几乎所有异常,但会忽略由您不想捕获的事物引起的异常,例如终止信号
  2. 您不需要将每一行读入内存,关闭文件,然后处理它。您可以在阅读时对其进行处理。这在这里并没有太大的区别,但是如果你有一个很大的文件,你可能没有足够的 RAM 来将整个东西放入 RAM
  3. 打开要读取的文件时,最好使用上下文管理器with open('demo.txt') as f: f.readline(),或者像我一样使用循环,这样您就不必担心以后要记住关闭文件-它会自动关闭
  4. 我认为您的代码最重要的是它非常冗长。Python 的强大功能使您可以以更短、更易读的方式完成您想做的事情。如果您需要在几个月后的某个时间点返回并阅读您的代码,您可能需要几分钟才能弄清楚它在做什么。更短的代码更容易阅读(只要它不仅仅是为了简短而简短,以至于难以阅读)

推荐阅读