Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中循环列表并删除条目_Python_List_For Loop_Deep Copy - Fatal编程技术网

在Python中循环列表并删除条目

在Python中循环列表并删除条目,python,list,for-loop,deep-copy,Python,List,For Loop,Deep Copy,我想在Python中循环一个列表并删除特定的项。 我不想创建一个新的接受项列表,因为在我的完整示例中,我想对我的列表进行一系列改进。下面是一个简单的例子,我尝试删除列表中小于3的所有数字 example = [1.,2.,3.,4.,5.,6.] for e in example: if e < 3.: print "Removing:", e example.remove(e) else: print "Accepting:", e print "NAIV

我想在Python中循环一个列表并删除特定的项。
我不想创建一个新的接受项列表,因为在我的完整示例中,我想对我的列表进行一系列改进。下面是一个简单的例子,我尝试删除列表中小于3的所有数字

example = [1.,2.,3.,4.,5.,6.]
for e in example:
  if e < 3.:
    print "Removing:", e
    example.remove(e)
  else:
    print "Accepting:", e
print "NAIVE:", example 

Removing: 1.0
Accepting: 3.0
Accepting: 4.0
Accepting: 5.0
Accepting: 6.0
NAIVE: [2.0, 3.0, 4.0, 5.0, 6.0]
这在这里起作用,但这是一种好的做法吗?是否会导致其他意外错误?有没有更好的方法来实现这一点?或者这种构造(循环并从列表中删除)根本上不可靠


我不想创建一个接受项目的新列表,因为我想对列表逐一应用一系列标准,并相应地删除项目。我不希望为我应用的每个标准都有一个新的列表(可能有很多),也不希望一次应用所有标准(因为查看每个标准删除了多少项等会很有帮助)。

你是对的,问题是你正在修改循环期间迭代的列表。这是非常不一致的,并导致许多错误。我的问题是,为什么您特别想删除列表中的项目,而不是生成符合您建议的新副本?有没有具体的要求?否则,我建议创建一个符合您限制的列表的新副本,而不是修改输入列表。因此,修改您的代码:

example = [1.,2.,3.,4.,5.,6.]
new_list = []
for e in example:
   if e >= 3.:
      new_list.append(e)
      print "Accepting:", e
   else:
      print "Removing: ", e
这不太容易出错,但您可以更通俗一些,并为此使用列表理解:

new_list = [e for e in example if e >= 3.]

编辑:我发现您想要删除项目而不是创建新列表的原因是您要对列表进行多次筛选。我仍然认为,即使在这种情况下,每次创建一个新列表的可读性更高,更不容易出错,效率也不会特别低。如果效率是个问题,并且您有非常大的列表或类似的东西,我将尝试只遍历列表一次,并在同一个循环中删除所有无效项。但是,如果你真的想从列表中删除项目,你可以按照@RemcoGerlich所说的做,然后按索引反向迭代。

你是对的,问题是你正在修改循环中迭代的列表。这是非常不一致的,并导致许多错误。我的问题是,为什么您特别想删除列表中的项目,而不是生成符合您建议的新副本?有没有具体的要求?否则,我建议创建一个符合您限制的列表的新副本,而不是修改输入列表。因此,修改您的代码:

example = [1.,2.,3.,4.,5.,6.]
new_list = []
for e in example:
   if e >= 3.:
      new_list.append(e)
      print "Accepting:", e
   else:
      print "Removing: ", e
这不太容易出错,但您可以更通俗一些,并为此使用列表理解:

new_list = [e for e in example if e >= 3.]

编辑:我发现您想要删除项目而不是创建新列表的原因是您要对列表进行多次筛选。我仍然认为,即使在这种情况下,每次创建一个新列表的可读性更高,更不容易出错,效率也不会特别低。如果效率是个问题,并且您有非常大的列表或类似的东西,我将尝试只遍历列表一次,并在同一个循环中删除所有无效项。然而,如果你真的想从列表中删除项目,你可以按照@RemcoGerlich所说的做,然后按索引反向迭代。

我不明白你为什么不用你想保留的项目构建一个新列表,因为你似乎并不关心构建一个新列表(毕竟,
copy
就是这么做的)

所以我就这么做

example = [f for f in example if f >= 3]
如果您确实希望遍历列表并对其进行更改,可以遍历索引并返回:

我们可以调用很多这样的测试:

example = [1., 2., 3., 4., 5., 6.]

for test in TESTS:
    example = filter_with_prints(example, test)

我不明白你为什么不用你想要保留的项目来构建一个新的列表,因为你似乎并不关心构建一个新的列表(毕竟,
copy
就是这样做的)

所以我就这么做

example = [f for f in example if f >= 3]
如果您确实希望遍历列表并对其进行更改,可以遍历索引并返回:

我们可以调用很多这样的测试:

example = [1., 2., 3., 4., 5., 6.]

for test in TESTS:
    example = filter_with_prints(example, test)

列表中的值总是浮点数还是数字?或者它们也可以是可变对象?此外,这些改进只是删除了列表中的元素,还是对列表中的元素进行了其他类型的更改?问得好。在我的全部工作中,列表将是可变对象的列表。细化是进一步的删除和可能的其他更改列表中的值总是浮点数还是数字?或者它们也可以是可变对象?此外,这些改进只是删除了列表中的元素,还是对列表中的元素进行了其他类型的更改?问得好。在我的全部工作中,列表将是可变对象的列表。这些改进是进一步的删除和可能的其他更改。我不想再列出一个新的列表——这是问题的第一部分。如果我想为许多选择多次这样做,我会有
new\u list\u 1
new\u list\u 2
等,或者必须做一些
old\u list=new\u list,new\u list=[]
之类的事情,这两件事看起来都不是很好,你可以做:
示例=[e代表e,如果e>=3.]
,然后
示例=[e代表e,如果有任何标准的话]
。这样可以避免使用时态变量名,并且代码看起来更干净。这与从列表中删除项目非常相似,不过每次都要复制一份。列表理解可以在不创建临时列表的情况下完成这项工作。例如,>>>示例=[1,2,3,4,5,6,7,8]>>>示例=[e for e in example if e>3]>>示例[4,5,6,7,8]我不想创建一个新列表-这是问题v1的最开始部分。如果我想在许多选择中多次这样做,我会有
新列表1
新列表2
等,或者必须做一些
旧列表=新列表,n