【发布时间】:2019-09-20 14:00:59
【问题描述】:
我有一个字典列表:
data = [
{'name': 'foo', 'scores': [2]},
{'name': 'bar', 'scores': [4, 9, 3]},
{'name': 'baz', 'scores': [6, 1]}
]
我想创建一个新列表,其中每个人 score 像这样分开:
list = [
{'name': 'foo', 'scores': [2], 'score': 2},
{'name': 'bar', 'scores': [4, 9, 3], 'score': 4},
{'name': 'bar', 'scores': [4, 9, 3], 'score': 9},
{'name': 'bar', 'scores': [4, 9, 3], 'score': 3},
{'name': 'baz', 'scores': [6, 1], 'score': 6},
{'name': 'baz', 'scores': [6, 1], 'score': 1}
]
然后我可以遍历每个row 和每个score,以创建一个新字典:
for row in data:
scores = row['scores'] # list of values
for score in scores:
new_row = row
new_row['score'] = score
print(new_row)
这正是我想要的:
{'name': 'foo', 'scores': [2], 'score': 2}
{'name': 'bar', 'scores': [4, 9, 3], 'score': 4}
{'name': 'bar', 'scores': [4, 9, 3], 'score': 9}
{'name': 'bar', 'scores': [4, 9, 3], 'score': 3}
{'name': 'baz', 'scores': [6, 1], 'score': 6}
{'name': 'baz', 'scores': [6, 1], 'score': 1}
但是,我无法将这些词典添加到列表中。当我使用append() 函数将每个字典添加到新列表时:
list = []
for row in data:
scores = row['scores'] # list of values
for score in scores:
new_row = row
new_row['score'] = score
list.append(new_row)
print(list)
似乎覆盖了之前的一些项目:
[
{'name': 'foo', 'scores': [2], 'score': 2},
{'name': 'bar', 'scores': [4, 9, 3], 'score': 3},
{'name': 'bar', 'scores': [4, 9, 3], 'score': 3},
{'name': 'bar', 'scores': [4, 9, 3], 'score': 3},
{'name': 'baz', 'scores': [6, 1], 'score': 1},
{'name': 'baz', 'scores': [6, 1], 'score': 1}
]
这里发生了什么?为什么它打印行正确,但添加到列表时覆盖以前的项目?我以为append() 只是将新项目添加到列表的末尾而不更改其他项目?
【问题讨论】:
-
new_row = row不会复制数据,它只是创建指向相同数据的引用。你可能想看看docs.python.org/2/library/copy.html -
请不要使用变量名如
listwhich shadows 关键字
标签: python list dictionary