【问题标题】:dynamic variables from list列表中的动态变量
【发布时间】:2016-04-04 13:27:10
【问题描述】:

这类似于Python creating dynamic global variable from list,但我仍然感到困惑。

我获得了大量半专有格式的 flo 数据。我已经使用 Python 根据需要剥离数据并将数据保存到名为 badactor.json 的 json 文件中,并以以下格式保存:

[saddr as a integer, daddr as a integer, port, date as Julian, time as decimal number]

任意示例[1053464536, 1232644361, 2222, 2014260, 15009]

我想查看每周/每月的 Flo 日志,并在 Julian 日期之前保存所有内容。首先,我想浏览日志并创建一个根据它发生的朱利安日期命名的列表,即2014260,然后将其保存为同名2014260.json。我有以下内容,但它给了我一个错误:

#!/usr/bin/python

import sys
import json
import time
from datetime import datetime

import calendar
#these are varibles I've had to use throughout, kinda a boiler plate for now
x=0
templist2 = []
templist3 = []
templist4 = []
templist5 = []
bad = {}
#this is my list of "bad actors", list is in the following format
#[saddr as a integer, daddr as a integer, port, date as Julian, time  as decimal number]
#or an arbitrary example [1053464536, 1232644361, 2222, 2014260, 15009]
badactor = 'badactor.json'

with open(badactor, 'r') as f1:
    badact = json.load(f1)
f1.close()

for i in badact:
    print i[3] #troubleshooting to verify my value is being read in
    tmp = str(i[3])
    print tmp#again just troubleshooting
    tl=[i[0],i[4],i[1],i[2]]
    bad[tmp]=bad[tmp]+tl
    print bad[tmp]

尝试创建变量时出现以下错误:

Traceback (most recent call last):
  File "savetofiles.py", line 39, in <module>
    bad[tmp]=bad[tmp]+tl
KeyError: '2014260'

【问题讨论】:

  • tmp 引用的密钥 - 在这种情况下为 '2014260' - 在 bad 中不存在。
  • 是否定义了坏床?
  • 我错过了什么吗?这似乎不是最小的工作示例,因为我没有看到您在提供的代码中的任何地方都将 bad 定义为字典? (虽然我可能是盲人)
  • 如果bad 未定义,它将是NameError
  • @TigerhawkT3;如果你尝试运行他的代码。他在某个地方定义了不好,并没有在他的 MWE 中显示出来。他遇到的问题是 bad 缺少密钥,在他向我们展示他如何添加到他的字典之前,我们无法说出原因。

标签: python variables dynamic


【解决方案1】:

在您的代码执行时,“坏”字典中没有键“2014260”。

你的问题在这里:

bad[tmp]=bad[tmp]+tl

您是在说“将 t1 添加到不存在的东西上。”

相反,你似乎想做:

bad[tmp]=tl

【讨论】:

    【解决方案2】:

    我建议您将bad 初始化为空的collections.defaultdict,而不仅仅是常规的内置dict。即

    import collections
      ...
    bad = collections.defaultdict(list)
    

    这样,第一次遇到日期键时,将自动为您创建初始的空 list 值,并且您从 bad[tmp]=bad[tmp]+tl 语句中得到的错误将消失,因为它实际上将变为 bad[tmp]=list()+tllist() 调用只是创建并返回一个空列表 — 第一次遇到特定日期。

    还不清楚您是否真的需要tmp = str(i[3]) 转换,因为任何非可变类型的值都是有效的字典(或defaultdict)键,而不仅仅是字符串——假设i[3] 已经不是字符串。无论如何,如果您将结果命名为其他名称,例如julian_date = i[3](或julian_date = str(i[3]),如果确实需要转换),后续代码将更具可读性。

    【讨论】:

    • “导入收藏”文章帮了大忙!我现在正在前进。不要试图听起来太需要,有没有更有效的方式我应该编码?
    • 好吧,您不需要f1.close(),因为with open 会为您处理好它。如果没有关于badact 条目包含的数据类型的更详细信息,很难提出任何重要的建议。顺便说一句,您可能应该阅读What should I do when someone answers my question?
    • 抱歉,我试图点击“这个答案很有用”,但它不会让我没有足够的声誉。 .我假设复选标记属于同一规则集。
    • 谢谢。您可能要考虑的一项更改是将bad[tmp]=bad[tmp]+tl 替换为bad[tmp].append(tl),因为这样,bad 中每个日期键的值将是一个列表列表,而不是一个包含所有项目的长合并列表日期。这样做可能会使bad 内容的后续处理更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多