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()函数对其进行了修改。我还是不太明白为什么你做的是合法的而他做的是