Python 从列表列表中删除列表
我想循环浏览字典中的列表列表,并根据列表中等于Python 从列表列表中删除列表,python,list,python-2.7,Python,List,Python 2.7,我想循环浏览字典中的列表列表,并根据列表中等于None的值删除某些列表。我的代码如下。它总是删除第一个列表,而不是删除满足条件的列表 我的代码: My_Table = { 'Table1' : {'Results': [["pineapple", 5], ["cherry", 7], ["kumquat", None], ["plum", None]]}, 'Table2' : {'Results': [["Orange", 5], ["Apple", 7], ["Pear",
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的迭代协议,并经常导致它意外地跳过项目 相反,您可以使用和切片分配:
for tbl, values in My_Table.viewitems():
values['Results'][:] = [x for x in values['Results'] if x[1] is not None]
print values['Results']
演示:
与当前代码不同,这将首先构建一个新列表,其中包含我们想要保留的所有项目。之后,它将使用切片分配将这些项目转移到旧列表中
[:]
使此操作成为就地操作。也就是说,values['Results']
对象只会被修改,不会被替换。如果我们这样做了:
values['Results'] = [x for x in values['Results'] if x[1] is not None]
代码仍然有效,但列表将替换为根据理解生成的新列表。在迭代序列时,切勿从序列中删除项目。这样做会破坏Python的迭代协议,并经常导致它意外地跳过项目 相反,您可以使用和切片分配:
for tbl, values in My_Table.viewitems():
values['Results'][:] = [x for x in values['Results'] if x[1] is not None]
print values['Results']
演示:
与当前代码不同,这将首先构建一个新列表,其中包含我们想要保留的所有项目。之后,它将使用切片分配将这些项目转移到旧列表中
[:]
使此操作成为就地操作。也就是说,values['Results']
对象只会被修改,不会被替换。如果我们这样做了:
values['Results'] = [x for x in values['Results'] if x[1] is not None]
代码仍然有效,但列表将替换为根据理解生成的新列表。在迭代序列时,切勿从序列中删除项目。这样做会破坏Python的迭代协议,并经常导致它意外地跳过项目 相反,您可以使用和切片分配:
for tbl, values in My_Table.viewitems():
values['Results'][:] = [x for x in values['Results'] if x[1] is not None]
print values['Results']
演示:
与当前代码不同,这将首先构建一个新列表,其中包含我们想要保留的所有项目。之后,它将使用切片分配将这些项目转移到旧列表中
[:]
使此操作成为就地操作。也就是说,values['Results']
对象只会被修改,不会被替换。如果我们这样做了:
values['Results'] = [x for x in values['Results'] if x[1] is not None]
代码仍然有效,但列表将替换为根据理解生成的新列表。在迭代序列时,切勿从序列中删除项目。这样做会破坏Python的迭代协议,并经常导致它意外地跳过项目 相反,您可以使用和切片分配:
for tbl, values in My_Table.viewitems():
values['Results'][:] = [x for x in values['Results'] if x[1] is not None]
print values['Results']
演示:
与当前代码不同,这将首先构建一个新列表,其中包含我们想要保留的所有项目。之后,它将使用切片分配将这些项目转移到旧列表中
[:]
使此操作成为就地操作。也就是说,values['Results']
对象只会被修改,不会被替换。如果我们这样做了:
values['Results'] = [x for x in values['Results'] if x[1] is not None]
代码仍然有效,但列表将被替换为根据理解而生成的新代码。请您解释一下使用[:]重新分配是如何工作的,以及为什么这是正确的?谢谢,我添加了一个解释。@iCodez实际上使用列表切片分配转换引擎盖下RHS上的对象。i、 e这里没有懒惰或记忆优势。@iCodez谢谢你,但我仍然没有得到什么东西-你说“对象被修改了,没有被替换”。但是OP也没有替换列表,他只是使用replace()函数对其进行了修改。我还是不明白为什么你做的是合法的而他做的不是。通过使用[:]您可以在值['Results']中创建列表的新副本,这意味着您将替换它。。。对吗?@thomas:你说OP的解决方案修改了列表是对的。不同之处在于,他在对其进行修改的同时也对其进行了迭代。但是,我的解决方案在我迭代列表以获得所需的值之后修改列表。而且,在这种情况下,
[:]
不会复制。它告诉Python使用切片赋值[:]
仅当它位于=
(又称表达式的一部分)左侧时才进行复制,如在copy=mylist[:]
中。请您解释一下使用[:]重新分配的工作原理,以及为什么这是正确的?谢谢,我添加了一个解释。@iCodez实际上使用列表切片分配转换引擎盖下RHS上的对象。i、 e这里没有懒惰或记忆优势。@iCodez谢谢你,但我仍然没有得到什么东西-你说“对象被修改了,没有被替换”。但是OP也没有替换列表,他只是使用replace()函数对其进行了修改。我还是不明白为什么你做的是合法的而他做的不是。通过使用[:]您可以在值['Results']中创建列表的新副本,这意味着您将替换它。。。对吗?@thomas:你说OP的解决方案修改了列表是对的。不同之处在于,他在对其进行修改的同时也对其进行了迭代。但是,我的解决方案在我迭代列表以获得所需的值之后修改列表。而且,在这种情况下,[:]
不会复制。它告诉Python使用切片赋值[:]
仅当它位于=
(又称表达式的一部分)左侧时才进行复制,如在copy=mylist[:]
中。请您解释一下使用[:]重新分配的工作原理,以及为什么这是正确的?谢谢,我添加了一个解释。@iCodez实际上使用列表切片分配转换引擎盖下RHS上的对象。i、 e这里没有懒惰或记忆优势。@iCodez谢谢你,但我仍然没有得到什么东西-你说“对象被修改了,没有被替换”。但是OP也没有替换列表,他只是使用replace()函数对其进行了修改。我还是不太明白为什么你做的是合法的而他做的是