Mar*_*sch 4 python dictionary list
我正在尝试删除Python中列表的最后一个元素:
di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
for el in di['children']:
di['children'].remove(el)
Run Code Online (Sandbox Code Playgroud)
我期待的是
print di
{'a': 3, 'children: []}
Run Code Online (Sandbox Code Playgroud)
但我得到的是
print di
{'a': 3, 'children': [{'c': 6}]}
Run Code Online (Sandbox Code Playgroud)
有人知道出了什么问题吗?
aba*_*ert 11
正如其他人所解释的那样,您无法在迭代时修改列表.
您可以在迭代它的副本时修改列表,但最好只生成一个新的过滤列表:
di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
di['children'] = [el for el in di['children'] if el not in di['children']]
Run Code Online (Sandbox Code Playgroud)
为什么这样更好?好吧,这意味着你要避免改变列表,这使你的代码更易于推理,更容易追踪,通常更容易编写,而且通常更快,更节省空间.事实上,您不必担心迭代变异问题,这是"更容易推理"部分的完美示例.
在某些情况下,它确实更难写,或更慢,或更少节省空间,这就是为什么这只是一个指导而不是硬规则.但它总是至少值得思考"我可以将其重写为不可变过滤器而不是变换器",即使答案有时可能变成"不".
还真的,是不是你的算法保证等同于将整个事情清空?在这种情况下:
di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
di['children'] = []
Run Code Online (Sandbox Code Playgroud)
在迭代时不应修改列表.你应该迭代一个副本.请参阅python文档.
试试这个...
di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
for el in di['children'][:]:
di['children'].remove(el)
Run Code Online (Sandbox Code Playgroud)
您正在迭代它时修改列表 - 当您删除第一个条目时,第二个条目成为第一个,并且已到达列表的末尾.相反,使用:
del di["children"][:]
Run Code Online (Sandbox Code Playgroud)
这将保留原始列表(与之不同di["children"] = []),因此如果您对其进行其他引用,它们也将反映截断.
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |