Python 当程序迈出成功的第一步时,为什么我有索引器?

Python 当程序迈出成功的第一步时,为什么我有索引器?,python,python-3.x,list,sorting,Python,Python 3.x,List,Sorting,我试着让sorter删除第一个列表中重复的IP并将其保存到一个文件中,但在第一轮成功后,它给了我Indexer:列表索引超出范围 我期待正常的排序过程,但它不起作用 代码: 您在迭代列表时从列表中删除,这就是为什么会得到一个索引器 这可以通过以下方式更容易实现: 您在迭代列表时从列表中删除,这就是为什么会得到一个索引器 这可以通过以下方式更容易实现: 你一下子改变了名单。例如,For expression获取长度为5个元素的列表,在第一次迭代后删除4个元素,因此在For的第二次迭代中,尝试提取第

我试着让sorter删除第一个列表中重复的IP并将其保存到一个文件中,但在第一轮成功后,它给了我Indexer:列表索引超出范围

我期待正常的排序过程,但它不起作用

代码:


您在迭代列表时从列表中删除,这就是为什么会得到一个索引器

这可以通过以下方式更容易实现:


您在迭代列表时从列表中删除,这就是为什么会得到一个索引器

这可以通过以下方式更容易实现:


你一下子改变了名单。例如,For expression获取长度为5个元素的列表,在第一次迭代后删除4个元素,因此在For的第二次迭代中,尝试提取第二个元素,但现在它不存在。
如有必要,保存顺序,可以使用生成器表达式:

ips = [ip for ip in ipList1 if ip not in set(list2)]

如果没有,只需使用集合表达式。

您快速更改了列表。例如,For expression获取长度为5个元素的列表,在第一次迭代后删除4个元素,因此在For的第二次迭代中,尝试提取第二个元素,但现在它不存在。
如有必要,保存顺序,可以使用生成器表达式:

ips = [ip for ip in ipList1 if ip not in set(list2)]

如果没有,只需使用集合表达式。

您不应该修改当前正在迭代的列表。 一个解决方案就是创建第三个列表来保存非重复项。另一种方法是只使用集合,然后将它们彼此相减,尽管我知道您是否喜欢一个列表中的重复项。此外,您现在的做法是,只有在其位于同一索引时,才会发现重复项

ip2 = open('rotten', 'r')
ipList1 = [line.strip().replace('\n', '') for line in ip1]
ipList2 = [line.strip().replace('\n', '') for line in ip2]
ip1.close()
ip2.close()
newlist = []
for v in ip1:
    if v not in ip2:
        newlist.append(v)

c = open('end', 'w')
c.write('\n'.join(newlist))
c.close()

您不应该修改当前正在迭代的列表。 一个解决方案就是创建第三个列表来保存非重复项。另一种方法是只使用集合,然后将它们彼此相减,尽管我知道您是否喜欢一个列表中的重复项。此外,您现在的做法是,只有在其位于同一索引时,才会发现重复项

ip2 = open('rotten', 'r')
ipList1 = [line.strip().replace('\n', '') for line in ip1]
ipList2 = [line.strip().replace('\n', '') for line in ip2]
ip1.close()
ip2.close()
newlist = []
for v in ip1:
    if v not in ip2:
        newlist.append(v)

c = open('end', 'w')
c.write('\n'.join(newlist))
c.close()

其他答案侧重于在遍历容器时从容器中删除。虽然这通常是个坏主意,但这并不是问题的症结所在,因为您已经(非语法化地)为循环设置了
,以使用索引序列,因此严格来说,您并不是在列表本身上迭代


不,这里的问题是
i-=1
a-=1
没有效果:当
for
循环开始一个新的迭代时,它不会脱离索引的先前值。它只是从您在开始时建立的迭代器(在您的例子中,
range()
)的输出中获取它总是注定要获取的下一个值。

其他答案侧重于在容器上进行迭代时从容器中删除。虽然这通常是个坏主意,但这并不是问题的症结所在,因为您已经(非语法化地)为
循环设置了
,以使用索引序列,因此严格来说,您并不是在列表本身上迭代


不,这里的问题是
i-=1
a-=1
没有效果:当
for
循环开始一个新的迭代时,它不会脱离索引的先前值。它只是从一开始建立的迭代器(在您的例子中,
range()
)中获取它注定要获取的下一个值。

您的“for”循环不是pythonic循环,过于复杂。在Python中,您只需对元素进行迭代,如果您真的需要为idx使用索引,enumerate中的元素(iterable):“您的”for“循环不是pythonic的,过于复杂。在Python中,您只需对元素进行迭代,如果确实需要使用“用于idx,枚举中的元素(iterable)”,
set
s在这里不起作用,因为
line.strip().split()
将返回一个不可损坏的列表(尽管这可能是一个错误-为什么OP每次从文件中读取一行,然后在换行符上拆分它们?
set
s在这里不起作用,因为
line.strip().split()
将返回一个不可损坏的列表(尽管这可能是一个错误——为什么OP一次读取文件中的一行,然后在换行符上拆分它们?)