从列表中删除列表

2024-03-28 18:40:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想遍历字典中的列表列表,并根据列表中的值等于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]]

Tags: 代码noneapple列表mytableitemresults
1条回答
网友
1楼 · 发布于 2024-03-28 18:40:21

在对序列进行迭代时,切勿从序列中移除项。这样做会破坏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]

代码仍然有效,但列表将被替换为从理解中生成的新代码。你知道吗

相关问题 更多 >