首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:字典列表只存储每次迭代中最后附加的值。

Python:字典列表只存储每次迭代中最后附加的值。
EN

Stack Overflow用户
提问于 2017-10-19 17:01:17
回答 4查看 5.4K关注 0票数 6

我有一张字典清单:

代码语言:javascript
复制
MylistOfdict = [{'Word': 'surveillance',
  'Word No': 1},
 {'Word': 'equivocal',
  'Word No': 2}]

我想要创建一个新的字典列表(word_db2),其中每个字典在MylistOfdict中都有3个字典。除了MylistOfdict的键和值之外,每个字典都应该有值类型1、类型2、类型3和带增量值的“卡片类型”密钥。

代码:

代码语言:javascript
复制
word_db2 = []

key = 1
for i in MylistOfdict:
    for j in range(1, 4):
        i['Card Type'] = 'Type '+str(j)
        i['Card Key'] = key
        print(i)

        word_db2.append(i)
        key += 1

输出:

代码语言:javascript
复制
{'Word No': 1, 'Card Key': 1, 'Word': 'surveillance', 'Card Type': 'Type 1'}
{'Word No': 1, 'Card Key': 2, 'Word': 'surveillance', 'Card Type': 'Type 2'}
{'Word No': 1, 'Card Key': 3, 'Word': 'surveillance', 'Card Type': 'Type 3'}
{'Word No': 2, 'Card Key': 4, 'Word': 'equivocal', 'Card Type': 'Type 1'}
{'Word No': 2, 'Card Key': 5, 'Word': 'equivocal', 'Card Type': 'Type 2'}
{'Word No': 2, 'Card Key': 6, 'Word': 'equivocal', 'Card Type': 'Type 3'}

此输出是正确的,但word_db2只在每次迭代中存储最后附加的值。

代码语言:javascript
复制
print(word_db2)

输出:

代码语言:javascript
复制
[{'Card Key': 3, 'Card Type': 'Type 3', 'Word': 'surveillance', 'Word No': 1},
 {'Card Key': 3, 'Card Type': 'Type 3', 'Word': 'surveillance', 'Word No': 1},
 {'Card Key': 3, 'Card Type': 'Type 3', 'Word': 'surveillance', 'Word No': 1},
 {'Card Key': 6, 'Card Type': 'Type 3', 'Word': 'equivocal', 'Word No': 2},
 {'Card Key': 6, 'Card Type': 'Type 3', 'Word': 'equivocal', 'Word No': 2},
 {'Card Key': 6, 'Card Type': 'Type 3', 'Word': 'equivocal', 'Word No': 2}]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-10-19 17:10:58

让我们一步一步地回顾循环体逻辑:

  1. 拿上其中的一个
  2. 修改它
  3. 将其附加到列表的末尾

因此,您忽略的关键是修改和附加在第一步中选择的相同对象。在片段的末尾,word_db2包含六个对象参考,但只有两个唯一。因此,输出显示类似的行。

您可以在修改和附加dict之前对dict进行浅拷贝():

代码语言:javascript
复制
for j in range(1, 4):
    i = dict(i)
    i['Card Type'] = 'Type '+str(j)
    i['Card Key'] = key
    print(i)

    word_db2.append(i)
    key += 1

请进一步注意,如果dict包含其他可更改的对象,如嵌套的dicts,则应该创建一个深拷贝

代码语言:javascript
复制
import copy
old_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
new_dict = copy.deepcopy(old_dict)
old_dict['a'][1] = 7
new_dict['a'][1] # 2
票数 6
EN

Stack Overflow用户

发布于 2017-10-19 17:25:03

在将字典追加到列表时,将追加对原始对象本身的引用。因此,您目前只是在内部循环的每次迭代中修改现有对象的键和值,所以最后写的值是唯一持续存在的东西。

为了满足您的需要,您需要在内部循环的每一次迭代中创建一个新的字典对象。对于MylistOfdict中显示的字典,一个简单的字典理解就可以了。但是,如果您有更复杂的字典,请使用复制模块的深度复制方法。

代码语言:javascript
复制
MylistOfdict = [{'Word': 'surveillance', 'Word No': 1}, 
                {'Word': 'equivocal', 'Word No': 2}]
word_db2 = []

key = 1
for i in MylistOfdict:
    for j in range(1, 4):
        # Creating a new dictionary object and copying keys and values from i
        new_dict = {k: v for k, v in i.items()}
        new_dict['Card Type'] = 'Type '+str(j)
        new_dict['Card Key'] = key

        print(new_dict)

        word_db2.append(new_dict)
        key += 1
票数 4
EN

Stack Overflow用户

发布于 2017-10-19 17:08:43

不要用同样的词条,复制它们的副本:

代码语言:javascript
复制
word_db2 = []

key = 1
for i in MylistOfdict:
    for j in range(1, 4):
        i = dict(i)
        i['Card Type'] = 'Type '+str(j)
        i['Card Key'] = key
        print(i)

        word_db2.append(i)
        key += 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46835197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档