双重嵌套 defaultdict

Double Nesting defaultdict

翻来覆去没弄明白,可能是一个非常简单的解决方案,但请帮助我理解。

来源(sample.txt):

1,1,2,3
2,3,2,4,4

这个:

import csv
from collections import defaultdict

input = "sample.txt"

with open(input) as f:
    r = csv.reader(f)
    d = defaultdict(list)
    rlabel = 1

    for row in r:
        d[rlabel].append(row)
        rlabel += 1

print(d)

得到这个:

defaultdict(<class 'list'>, {1: [['1', '1', '2', '3']], 2: [['2', '3', '2', '4', '4']]})

为什么我的列表周围有双括号?

使用 defaultdict,创建键时会关联一个默认值

>>> d = defaultdict(list)
>>> 'a' in d[1]
False
>>> d
defaultdict(<class 'list'>, {1: []})

鉴于您的行是一个列表,您正在将一个列表附加到与该键关联的列表中。
要添加你可以做的元素

d[rlabel]+= row

Why are there double brackets around my lists?

您的代码完全符合预期。重点是extendappend.

的用法
  • append 添加您作为单个元素传递的参数。由于列表是一个对象,而你的默认字典 class 是列表,所以列表被附加为列表的列表。

  • extend 方法在输入中迭代并通过添加可迭代对象中的所有元素来扩展原始列表。

因此,在这种情况下,如果您想将单个列表添加到您的 defaultdict,您应该使用 list.extend 方法。你的输出将是:

defaultdict(<class 'list'>, {1: ['1', '1', '2', '3'], 2: ['2', '3', '2', '4', '4']})