从列表列表中删除列表
Removing an list from a list of list
我想遍历字典中的列表列表,并根据列表中等于 None
的值删除某些列表。我的代码如下。它不会删除满足条件的列表,而是始终删除第一个列表。
我的代码:
My_Table = {
'Table1' : {'Results': [["pineapple", 5], ["cherry", 7], ["kumquat", None], ["plum", None]]},
'Table2' : {'Results': [["Orange", 5], ["Apple", 7], ["Pear", None], ["cantelope", None]]},
}
for tbl, values in My_Table.viewitems():
for item_values in values['Results']:
if item_values[1] is not None:
values['Results'].remove(item_values)
print values['Results']
输出:
[['Apple', 7], ['Pear', None], ['cantelope', None]]
[['cherry', 7], ['kumquat', None], ['plum', None]]
期望的输出:
[['Orange', 5], ['Apple', 7]]
[['pineapple', 5], ['cherry', 7]]
永远不要在遍历序列时从序列中删除项目。这样做会搞砸 Python 的迭代协议,并经常导致它意外地跳过项目。
相反,您可以使用 list comprehension 和切片赋值:
for tbl, values in My_Table.viewitems():
values['Results'][:] = [x for x in values['Results'] if x[1] is not None]
print values['Results']
演示:
>>> My_Table = {
... 'Table1' : {'Results': [["pineapple", 5], ["cherry", 7], ["kumquat", None], ["plum", None]]},
... 'Table2' : {'Results': [["Orange", 5], ["Apple", 7], ["Pear", None], ["cantelope", None]]},
... }
>>> for tbl, values in My_Table.viewitems():
... values['Results'][:] = [x for x in values['Results'] if x[1] is not None]
... print values['Results']
...
[['Orange', 5], ['Apple', 7]]
[['pineapple', 5], ['cherry', 7]]
>>>
与您当前的代码不同,这将首先构建一个新列表,其中包含我们要保留的所有项目。之后,它将使用切片分配将这些项目转移到旧列表中。
[:]
使其成为就地操作。意思是,values['Results']
对象只是被修改,而不是被替换。如果我们改为这样做:
values['Results'] = [x for x in values['Results'] if x[1] is not None]
代码仍然有效,但列表将被替换为根据理解生成的新列表。
我想遍历字典中的列表列表,并根据列表中等于 None
的值删除某些列表。我的代码如下。它不会删除满足条件的列表,而是始终删除第一个列表。
我的代码:
My_Table = {
'Table1' : {'Results': [["pineapple", 5], ["cherry", 7], ["kumquat", None], ["plum", None]]},
'Table2' : {'Results': [["Orange", 5], ["Apple", 7], ["Pear", None], ["cantelope", None]]},
}
for tbl, values in My_Table.viewitems():
for item_values in values['Results']:
if item_values[1] is not None:
values['Results'].remove(item_values)
print values['Results']
输出:
[['Apple', 7], ['Pear', None], ['cantelope', None]]
[['cherry', 7], ['kumquat', None], ['plum', None]]
期望的输出:
[['Orange', 5], ['Apple', 7]]
[['pineapple', 5], ['cherry', 7]]
永远不要在遍历序列时从序列中删除项目。这样做会搞砸 Python 的迭代协议,并经常导致它意外地跳过项目。
相反,您可以使用 list comprehension 和切片赋值:
for tbl, values in My_Table.viewitems():
values['Results'][:] = [x for x in values['Results'] if x[1] is not None]
print values['Results']
演示:
>>> My_Table = {
... 'Table1' : {'Results': [["pineapple", 5], ["cherry", 7], ["kumquat", None], ["plum", None]]},
... 'Table2' : {'Results': [["Orange", 5], ["Apple", 7], ["Pear", None], ["cantelope", None]]},
... }
>>> for tbl, values in My_Table.viewitems():
... values['Results'][:] = [x for x in values['Results'] if x[1] is not None]
... print values['Results']
...
[['Orange', 5], ['Apple', 7]]
[['pineapple', 5], ['cherry', 7]]
>>>
与您当前的代码不同,这将首先构建一个新列表,其中包含我们要保留的所有项目。之后,它将使用切片分配将这些项目转移到旧列表中。
[:]
使其成为就地操作。意思是,values['Results']
对象只是被修改,而不是被替换。如果我们改为这样做:
values['Results'] = [x for x in values['Results'] if x[1] is not None]
代码仍然有效,但列表将被替换为根据理解生成的新列表。