【问题标题】:Using Dictionary get method to return empty list by default returns None instead使用 Dictionary get 方法返回空列表默认​​返回 None
【发布时间】:2011-04-24 17:43:23
【问题描述】:

在 Python 中,我想使用字典 get 方法构建一个数组字典,默认情况下提供一个空列表,然后填充信息,例如:

dct = {}
for i in range(0, 10):
    for j in range(0, 100):
        dct[i] = dct.get(i, []).append(j)

但是,当我尝试上面的代码时,我没有发现任何异常,但我的列表最终如下:

AttributeError: 'NoneType' 对象没有属性 'append'

列表有一个append 方法,因此我将测试简化为以下内容:

dct = {}
for i in range(0, 10):
    dct[i] = dct.get(i, []).append(i)

输出如下:

{0:无,1:无,2:无,3:无,4:无,5:无,6:无,7:无,8:无,9:无}

所以我的问题是为什么dct.get(i, []) 默认返回None 而不是[]?做dct.get(i, list())有同样的问题,所以我有点难过。

【问题讨论】:

  • 请不要使用dict作为变量名。它与内置的dict 类冲突。
  • 我通常不这样做,我只是想弄清楚变量是什么。
  • 您不希望dict[i] = 位于setdefault 前面。请参阅我编辑的答案。
  • 您的第一个 setdefault 代码有缺陷,不要分配回 dict[i]。 dict.setdefault( i, [] ).append( j ) 应该是你所需要的。
  • 你说得对,我刚刚想通了。谢谢,我希望我能让你们都正确:(

标签: python list dictionary


【解决方案1】:

要解决这个问题,您应该使用 Python 的 defaultdict。第一次使用不存在的键时,defaultdict 构造函数的参数用于创建值(在本例中为列表)。

http://docs.python.org/library/collections.html#defaultdict-examples

from collections import defaultdict 

d = defaultdict(list)
for i in range( 0, 10 ):
    for j in range( 0, 100 ):
        d[i].append( j )

如果您想做更详细的操作,也可以将函数作为参数传递给 defaultdict。

【讨论】:

  • 这是正确的答案。在 Python 中“自己动手”没有加分。
【解决方案2】:

返回 None 的不是 dict.get( i, [] ),而是 append。您可能想使用dict.setdefault(i, []).append(j) 或首先使用defaultdict。

你会这样做:

d = {}
for i in range( 0, 10 ):
    for j in range( 0, 100 ):
        d.setdefault( i, [] ).append( j )

请注意,我将dict 更改为d,因为dict 在Python 中已经意味着某些东西(您正在重新定义它),并且我删除了导致错误消息的多余dict[i] =。

【讨论】:

    【解决方案3】:

    通过利用列表添加来使用get 方法的替代方法。

    d = {}
    for i in range(0, 10):
        for j in range(0, 100):
            d[i] = d.get(i, []) + [j]
    

    【讨论】:

    • 问题是这需要首先从j 中创建一个元素列表才能利用它。
    【解决方案4】:

    问题是append 返回None 而不是列表对象。所以

    dict[i] = dict.get( i, [] ).append( j ) 将 None 分配给 dict[i]

    但是,您可以做的更简单:

    dict.setdefault( i, [] ).append( j )
    

    .. 引用 setdefault 的文档:

    如果键在字典中,则返回其值。如果不是,则插入值为默认值的键并返回默认值

    因此,如果键 i 尚未出现,它会创建它并在其中存储默认值,无论哪种情况,它都会返回键值 - 这是对列表的引用,因此您可以直接修改它。

    【讨论】:

    • 在同一行执行 append 和 setdefault 导致我在 Python 2.7.1 上出现异常。
    • 适用于我的 2.6 和 3.1
    【解决方案5】:

    append 不返回列表。它将值附加到列表并返回None。

    而不是这个:

     dict[i] = dict.get( i, [] ).append( j ) 
    

    你可以这样做:

     dict.setdefault(i, [])
     dict[i].append( j )
    

    【讨论】:

    • 或者,在一行中:dict.setdefault(i, []).append( j ) - 尽管应该注意 defaultdict 更快。
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2020-02-05
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多