为什么嵌套的字典不能正确追加到列表中?

问题描述 投票:2回答:2

我试图将一个字典追加到一个列表中,但我发现子字典总是保持我从CSV文件(deviceProfile.csv)中读取的最后一个。有人知道为什么吗?这是我的CSV文件。

name,description,primaryTable,startingAddress,boolIndex
test_name_1,1,table_1,1,1
test_name_2,2,table_2,2,2
test_name_3,3,table_3,3,3

这是我的python代码。

import csv
import yaml
from pprint import pprint

resource = {
    'name': "",
    'description': "",
    'attributes':
      { 'primaryTable': "", 'startingAddress': "", 'boolIndex': "" },
}

resourceArray = []

with open("deviceProfile.csv") as f:
    myCsvDic = csv.DictReader(f)
    for row in myCsvDic:
        resource['name'] = row['name']
        resource['description'] = row['description']
        resource['attributes']['primaryTable'] = row['primaryTable']
        resource['attributes']['startingAddress'] = row['startingAddress']
        resource['attributes']['boolIndex'] = row['boolIndex']
        test = resource.copy()
        resourceArray.append(test)

pprint (resourceArray)

结果是

[{'attributes': {'boolIndex': '3',
                 'primaryTable': 'table_3',
                 'startingAddress': '3'},
  'description': '1',
  'name': 'test_name_1'},
 {'attributes': {'boolIndex': '3',
                 'primaryTable': 'table_3',
                 'startingAddress': '3'},
  'description': '2',
  'name': 'test_name_2'},
 {'attributes': {'boolIndex': '3',
                 'primaryTable': 'table_3',
                 'startingAddress': '3'},
  'description': '3',
  'name': 'test_name_3'}]

奇怪的是 名称描述 正确地添加到列表中,但 属性. 该 属性 总是附加最后一个子字典。

任何帮助将被感激。谢谢。

python list dictionary append
2个回答
1
投票

这是因为 copy...默认情况下,复制是浅层复制,它将只复制1级元素。deepcopy 在你的情况下。test = resource.copy() 与。

from copy import deepcopy

test = deepcopy(resource)

看看这个 链接 更多信息,或任何其他链接,告诉你关于 copy(shallow and deep).


0
投票

你为什么要 resource 在顶部的循环外?

resource = {
    'name': "",
    'description': "",
    'attributes':
      { 'primaryTable': "", 'startingAddress': "", 'boolIndex': "" },
}

去掉这个,然后把循环改成这样。

for row in myCsvDic:
    resource = {}
    resource['name'] = row['name']
    resource['description'] = row['description']
    resource['attributes']['primaryTable'] = row['primaryTable']
    resource['attributes']['startingAddress'] = row['startingAddress']
    resource['attributes']['boolIndex'] = row['boolIndex']
    resourceArray.append(resource)
© www.soinside.com 2019 - 2024. All rights reserved.