gpt4 book ai didi

python - 将元素插入字典列表

转载 作者:太空宇宙 更新时间:2023-11-04 09:49:11 24 4
gpt4 key购买 nike

我已经声明了一个空列表,我想使用 extend() 方法通过 for 循环附加字典,但我以一个相同的列表结尾所有位置的内容(同一个字典)

这是代码:

def get_tasks(self, actor, task_state):
tasks = Task.objects.filter(actor=actor.id, state=task_state)
tasks_to_return = []
task_data = {}

for task in tasks:
task_data['name'] = getattr(task, 'name')
task_data['description'] = getattr(task, 'description')
task_data['start_date'] = getattr(task, 'start_date')
task_data['finish_date'] = getattr(task, 'finish_date')
task_data['situation'] = task.get_situation()
tasks_to_return.extend(task_data)

return tasks_to_return

如果我将 extend() 更改为 append(),结果会更糟。

最佳答案

那是因为你每次都将相同字典添加到列表中:实际上你只是更改了该字典的键/值,然后第二次添加了该字典,等等。

此外,通过使用 extend,您实际上可以向列表中添加 iterable 元素。字典是一个可迭代的:您迭代键。

所以您应该做的是 (1) 每次构造一个新字典,以及 (2) 使用 append 而不是 extend:

for task in tasks:
<b>task_data = {}</b>
task_data['name'] = getattr(task, 'name')
task_data['description'] = getattr(task, 'description')
task_data['start_date'] = getattr(task, 'start_date')
task_data['finish_date'] = getattr(task, 'finish_date')
task_data['situation'] = task.get_situation()
tasks_to_return.<b>append</b>(task_data)

我们还可以改进代码,例如我们可以在构建字典时而不是设置键值对。您使用 getattr(..),但这在这里不是必需的:我们可以使用 task.name 而不是 getattr(task, 'name'),所以更优雅的方法可能是:

tasks_to_return = []
task_data = {}
for task in tasks:
<b>task_data = {
'name': task.name,
'description': task.description,
'start_date': task.start_date,
'finish_date': task.finish_date,
'situation': task.situation
}</b>
tasks_to_return.append(task_data)

现在由于列表最初是空的,我们还可以使用列表理解:

<b>tasks_to_return = </b>[ {
'name': task.name,
'description': task.description,
'start_date': task.start_date,
'finish_date': task.finish_date,
'situation': task.situation
} <b>for task in tasks]</b>

关于python - 将元素插入字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48551574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com