Python 在字典列表中插入元素
我声明了一个空列表,我想使用extend方法通过for循环追加字典,但最后得到一个列表,该列表在同一个字典的所有位置都具有相同的内容 代码如下:Python 在字典列表中插入元素,python,django,Python,Django,我声明了一个空列表,我想使用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:
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添加到列表中。字典是一个iterable:你在键上迭代 因此,您应该做的是1每次构造一个新词典,2使用append而不是extend:
for task in tasks:
task_data = {}
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.append(task_data)
现在,由于列表最初为空,我们还可以使用列表理解:
这是因为您每次都将同一个字典添加到列表中:实际上,您只需更改该字典的键/值,然后再次添加该字典,以此类推 此外,通过使用extend,实际上可以将元素的iterable添加到列表中。字典是一个iterable:你在键上迭代 因此,您应该做的是1每次构造一个新词典,2使用append而不是extend:
for task in tasks:
task_data = {}
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.append(task_data)
现在,由于列表最初为空,我们还可以使用列表理解:
扩展或追加会将原始引用添加到任务_数据,您会不断更改其内容。相反,可以为task_数据创建一个新的空对象,或者附加一个重复使用的对象的副本:
import copy
...
tasks_to_return.append(copy.copy(task_data))
扩展或追加会将原始引用添加到任务_数据,您会不断更改其内容。相反,可以为task_数据创建一个新的空对象,或者附加一个重复使用的对象的副本:
import copy
...
tasks_to_return.append(copy.copy(task_data))
您不应该在每个循环迭代中创建一个新的dict来附加到任务返回中吗?另外,我认为您应该使用append而不是extend。您不应该在每个循环迭代中创建一个新的dict来追加到任务返回中吗?另外,我认为您希望使用append而不是extend。太棒了!一切都很顺利。今天是一个非常有成效的学习日。谢谢!好极了一切都很顺利。今天是一个非常有成效的学习日。谢谢!
import copy
...
tasks_to_return.append(copy.copy(task_data))