繁体   English   中英

将值列表传递到 Python 中的字典中

[英]Passing list of values into dictionary in 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)

我会做这样的事情:

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. 您不需要将每一行都读入 memory,关闭文件,然后再进行处理。 您可以在阅读时对其进行处理。 这在这里并没有太大的区别,但是如果你有一个很大的文件,你可能没有足够的 RAM 来将整个东西放入 RAM
  3. 打开要读取的文件时,最好使用with open('demo.txt') as f: f.readline()的上下文管理器,或者像我一样使用循环,这样您就不必担心记得稍后关闭文件 - 它会自动关闭
  4. 我认为您的代码最重要的是它非常冗长。 Python 的强大功能可让您以更短、更易读的方式完成您想做的事情。 如果您需要在几个月后的某个时间点返回 go 并阅读您的代码,您可能需要几分钟才能弄清楚它在做什么。 更短的代码更容易阅读(只要它不仅仅是为了简短而简短,以至于难以阅读)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM