【问题标题】:Dictionary update replaces original values instead字典更新替换原始值
【发布时间】:2021-03-19 02:26:15
【问题描述】:

每当我收到一个新的网址时,我都会尝试将它与当前时间一起添加到我的字典中。 但是,当我使用update() 方法时,它会将原始值替换为我添加的新值,因此字典中现在唯一的内容是新值(而不是旧值)。

这是我的代码的一个较短版本:

    if domain not in lst:
        lst.append(domain)
        domaindict = {} 
        listofdomains.append(domaindict)
        domaindict.update({domain:datetime.now().strftime('%m/%d/%Y %H:%M:%S')})
    if domain in lst:
        domindex = lst.index(domain) 
        listofdomains[domindex].update({domain:datetime.now().strftime('%m/%d/%Y %H:%M:%S')})

lst 是迄今为止的域names 列表,而listofdomains 是包含各个域的所有字典的列表(每个字典都有域名和时间)。

当我尝试打印域列表时:

print(listofdomains)

它只打印字典中新添加的域和网址。我还尝试使用其他方法来更新字典,如this question 的答案中所述,但我的字典仍然无法正常运行。

为什么原来的键/值对消失了?

【问题讨论】:

  • 因为你总是使用相同的domain 键,所以你只需替换值。字典中不能有重复的键。您可能应该重新考虑您的数据结构 - 维护两个并行列表可能不是一个好主意...
  • 根据文档,dict.update 方法用新数据更新字典的内容。因此,字典只包含最后更新的值。如果要生成条目列表,则需要将值添加到字典中,而不是根据键更新。
  • @itprorh66 那我该如何实现呢?
  • @ThierryLathuille 非常感谢!!!!!!!在你告诉我之后,我终于想出了一个解决方案;切换键和值,以便新键不会重复。谢谢!!!
  • 这一切都取决于您想要做什么,目前您正在为每个域创建一个字典,其键定义为由domain:datetime.now().strftime('%m/%d/%Y %H:%M:%S') 确定的字符串,没有值。 listofDomains 包含一个字典列表,每个字典都有一个时间字符串键。您试图跟踪什么以及以后访问是什么?

标签: python python-3.x list dictionary


【解决方案1】:

最简单的结构可能是列表的字典:

data = {domain1:[time1, time2, ...], domain2:[...] ...}

您可以简单地使用 defaultdict 在需要时动态创建空列表来构建它。你的代码是:

from collections import defaultdict

data = defaultdict(list)

你的整个代码就变得简单了:

data[domain].append(datetime.now().strftime('%m/%d/%Y %H:%M:%S'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 2015-10-30
    • 1970-01-01
    • 2013-11-15
    • 2021-08-31
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多