Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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/9/loops/2.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_Loops_For Loop - Fatal编程技术网

Python 怪异';部分完工';环的

Python 怪异';部分完工';环的,python,loops,for-loop,Python,Loops,For Loop,好吧,这可能真的很琐碎(我对这个很陌生),但我已经被困在这一点有一段时间了,我不明白为什么我下面的函数会返回如此奇怪的结果 testx = [(1,2), (1,1), (2,2), (3,5), (4,4), (5,5)] def test_loop(interval_set): for item in interval_set: if item[0] == item[1]: interval_set.remove(item) return interval_set

好吧,这可能真的很琐碎(我对这个很陌生),但我已经被困在这一点有一段时间了,我不明白为什么我下面的函数会返回如此奇怪的结果

testx = [(1,2), (1,1), (2,2), (3,5), (4,4), (5,5)]

def test_loop(interval_set):
for item in interval_set:
    if item[0] == item[1]:
        interval_set.remove(item)
return interval_set

print test_loop(testx)

>>>[(1, 2), (2, 2), (3, 5), (5, 5)]

如果您注意到,只有重复集(1,1)和(4,4)被删除,而(2,2)和(5,5)保留在列表中。这几乎不合逻辑,请协助。

当您在同一列表上迭代时,不应该从列表中删除项目。尝试迭代该列表的副本,如下所示:

testx = [(1,2), (1,1), (2,2), (3,5), (4,4), (5,5)]

def test_loop(interval_set):
    for item in list(interval_set):
        if item[0] == item[1]:
            interval_set.remove(item)
    return interval_set

print test_loop(testx)
[item for item in testx if item[0] != item[1]]
产出:

[(1, 2), (3, 5)]

当您在同一个列表上迭代时,不应该从列表中删除项目。尝试迭代该列表的副本,如下所示:

testx = [(1,2), (1,1), (2,2), (3,5), (4,4), (5,5)]

def test_loop(interval_set):
    for item in list(interval_set):
        if item[0] == item[1]:
            interval_set.remove(item)
    return interval_set

print test_loop(testx)
[item for item in testx if item[0] != item[1]]
产出:

[(1, 2), (3, 5)]

在集合(dict、list、set)上进行迭代,同时从集合中删除内容是不好的,因为您将删除项目,从而缩短集合并更早地打破循环

我建议做一个列表理解,如下所示:

testx = [(1,2), (1,1), (2,2), (3,5), (4,4), (5,5)]

def test_loop(interval_set):
    for item in list(interval_set):
        if item[0] == item[1]:
            interval_set.remove(item)
    return interval_set

print test_loop(testx)
[item for item in testx if item[0] != item[1]]
以获得您期望的结果


您可以在此处阅读有关列表理解的文档

在集合(dict、list、set)上迭代,同时从集合中删除内容是不好的,因为您将删除项目,缩短集合并提前打破循环

我建议做一个列表理解,如下所示:

testx = [(1,2), (1,1), (2,2), (3,5), (4,4), (5,5)]

def test_loop(interval_set):
    for item in list(interval_set):
        if item[0] == item[1]:
            interval_set.remove(item)
    return interval_set

print test_loop(testx)
[item for item in testx if item[0] != item[1]]
以获得您期望的结果


您可以在此处阅读有关列表理解的文档,只是为了添加一些说明,说明为什么修改正在迭代的序列是个坏主意。这是一个列表,箭头指示迭代器当前所在的位置:

 v
[0, 1, 2, 3, 4, 5]
现在让我们假设您删除
0
,所发生的是列表向前移动,因此现在看起来是这样的,请注意迭代器的位置:

 v
[1, 2, 3, 4, 5]
现在迭代器前进到下一项,而不进行任何计算/比较/任何
1

    v
[1, 2, 3, 4, 5]
现在,您的代码备份到
for
循环的第一行,它将在值
2
上执行您的代码,但
1
从未计算过

使用列表理解通常是最好的方法,但是由于理解语法的限制,有时需要单独的函数

def test_loop(interval_set):
    return [item for item in interval_set if item[0] != item[1]]
此外,如果您正在构建数学意义上的
集合(无重复项),您随时可以:

>>> interval_set = [(1,1), (1,1), (2,2), (3,5), (4,4), (4,4)]
>>> set(interval_set)
set([(1,1), (2,2), (3,5),(4,4)])

只是为了说明为什么修改迭代的序列是个坏主意。这是一个列表,箭头指示迭代器当前所在的位置:

 v
[0, 1, 2, 3, 4, 5]
现在让我们假设您删除
0
,所发生的是列表向前移动,因此现在看起来是这样的,请注意迭代器的位置:

 v
[1, 2, 3, 4, 5]
现在迭代器前进到下一项,而不进行任何计算/比较/任何
1

    v
[1, 2, 3, 4, 5]
现在,您的代码备份到
for
循环的第一行,它将在值
2
上执行您的代码,但
1
从未计算过

使用列表理解通常是最好的方法,但是由于理解语法的限制,有时需要单独的函数

def test_loop(interval_set):
    return [item for item in interval_set if item[0] != item[1]]
此外,如果您正在构建数学意义上的
集合(无重复项),您随时可以:

>>> interval_set = [(1,1), (1,1), (2,2), (3,5), (4,4), (4,4)]
>>> set(interval_set)
set([(1,1), (2,2), (3,5),(4,4)])

构建一个新的要保留的值列表,而不是创建一个副本进行迭代,以便可以从原始值中删除,这通常更简单。特别是对于列表,因为否则您必须向后执行操作。(对于集合而言,这并不是什么大问题,因为您可以使用
删除
,但这仍然不是最好的方法。)@abarnert Right。我也更喜欢做列表理解。我只是想向OP展示一下,他是如何最小限度地修改代码并使其正常工作的。天哪,谢谢。我不敢相信添加列表()会改变结果。我不知道为什么python不能直接迭代,但现在知道如何避免了!谢谢@Vickneshkodakmaneslvam:了解添加一个
list()
的作用(它是列表的一个副本)以及为什么它会产生不同是非常重要的(这在这个答案和另一个答案中有解释,可能在NPE给你的链接中也有解释,所以如果你读了所有的链接,希望你能理解它)。@Vickneshkodakmaneslvam嘿,我仍然建议阅读关于列表理解的内容,这是一种更符合python的方式来实现您正在尝试的内容。构建一个新的要保留的值列表,而不是制作一个副本进行迭代,以便您可以从原始列表中删除,通常更简单。特别是对于列表,因为否则您必须向后执行操作。(对于集合而言,这并不是什么大问题,因为您可以使用
删除
,但这仍然不是最好的方法。)@abarnert Right。我也更喜欢做列表理解。我只是想向OP展示一下,他是如何最小限度地修改代码并使其正常工作的。天哪,谢谢。我不敢相信添加列表()会改变结果。我不知道为什么python不能直接迭代,但现在知道如何避免了!谢谢@Vickneshkodakmaneslvam:了解添加一个
list()
的作用(它是列表的一个副本)以及为什么它会产生不同是非常重要的(这在这个答案和另一个答案中有解释,可能在NPE给你的链接中也有解释,所以如果你读了所有的链接,希望你能理解它)。@Vickneshkodakmaneslvam嘿,我仍然建议你阅读关于列表理解的内容,这是一种更具python风格的方式来实现你正在尝试的东西。天哪,这真是一个很棒的解释!我现在明白了,谢谢!天哪,这解释太棒了!我现在明白了,谢谢!