当前位置: 首页 > 面试题库 >

附加到Python字典中的列表

南宫书
2023-03-14
问题内容

有没有更优雅的方式来编写此代码

我在做什么:我有键和日期。可能有多个日期分配给键,因此我正在创建一个包含日期列表的字典来表示这一点。以下代码可以正常工作,但是我希望有一个更优雅和Pythonic的方法。

dates_dict = dict() 
for key,  date in cur:
    if key in dates_dict:
        dates_dict[key].append(date)
    else:
        dates_dict[key] = [date]

我期望下面的工作,但我不断得到一个NoneType没有属性附加错误。

dates_dict = dict() 
for key,  date in cur:
    dates_dict[key] = dates_dict.get(key, []).append(date)

这可能与以下事实有关:

print([].append(1)) 
None

但为什么?


问题答案:

list.append返回None,因为它是就地操作,并且您将其分配回dates_dict[key]。因此,下一次dates_dict.get(key, []).append您实际要做的是None.append。这就是为什么它失败了。相反,您只需

dates_dict.setdefault(key, []).append(date)

但是,我们collections.defaultdict仅出于此目的。你可以做这样的事情

from collections import defaultdict
dates_dict = defaultdict(list)
for key, date in cur:
    dates_dict[key].append(date)

如果key在字典中找不到,则会创建一个新的列表对象。

注意:defaultdict如果在字典中找不到关键字,则由于会创建一个新列表,因此会产生意想不到的副作用。例如,如果您只想检索键的值(该值不存在),它将创建一个新列表并返回它。



 类似资料:
  • 问题内容: 问题 我正在以以下方式创建一个空列表作为值的字典。 字典看起来像这样。 当我将一个值附加到一个列表时,此示例将值附加到所有列表。 问题 我的问题分为两部分。首先,为什么会这样?第二,我该怎么办?也就是说,如何将一个值仅附加到一个列表中? 我想象在创建字典时,我使所有列表都指向同一个对象。但是我不明白怎么回事,因为当我输入而不是在字典创建中,然后添加值而不是附加值时,这些值的行为会不同,

  • 给一本字典: 如何将键附加到列表中? 我走了这么远:

  • 问题内容: 我遇到了我认为在Python中很奇怪的行为,并且我希望有人能解释一下。 我创建了一个空的2D列表 我可以预期以下工作: 产量 产量 但是,当我追加到一个空列表之一时,python追加到所有子列表中,如下所示: 产量。 谁能向我解释为什么会发生这种现象? 问题答案: 您尚未创建三个 不同的 空列表。您已经创建了 一个 空的列表,然后创建了三个引用到一个新的列表 相同的 空单。要解决此问题

  • 问题内容: 组装传递给GRMustache.swift的数据有效载荷以渲染胡子模板时,我处于一种需要将数据附加到先前在字典中定义的数组的场景中。 我的数据结构开始于: 该密钥对是一家集我需要一个循环内后追加。 要添加到数组中,我正在尝试类似的方法: 此错误,因为type的值没有成员,并且二进制运算符不能应用于type 和的操作数。 这很有意义,因为我需要强制转换要附加的值。但是,我不能改变数组。

  • 我正在导入一个文本文件,该文件将行星与其状态关联为True(对于行星),或False(对于矮星),其顺序必须与下面的字典键相同。 这是一本名为“索尔”的字典: {‘天王星’:[275030002880],‘水星’:[46,70,57],‘地球’:[147152150],‘金星’:[107109108],‘火星’:[205249228],‘土星’:[13501510140],‘木星’:[741817

  • 问题内容: 我是一名基本的python程序员,因此希望我的问题的答案会很容易。我正在尝试拿字典并将其附加到列表中。然后,字典更改值,然后再次循环添加。似乎每次执行此操作时,列表中的所有词典都会更改其值以匹配刚刚添加的值。例如: 我认为结果是,但是我得到了: 任何帮助是极大的赞赏。 问题答案: 您需要追加一个 副本 ,否则您将一遍又一遍地添加对同一词典的引用: 我用和代替和; 您不想掩盖内置类型。