使用for循环与if语句实现集合差集时遭遇列表索引越界问题求助
for循环与if语句实现集合差集时遭遇列表索引越界问题求助
嗨,兄弟,我来帮你捋捋这个问题~
你想要手动实现集合的差集效果(找出my_set里不在your_set中的元素),不用集合内置方法,用for和if来完成,但运行代码时碰到了list index out of range(列表索引越界)的错误,对吧?
先说说为什么会报错
你把集合转成列表后,用range(len(my_list))来遍历索引,但在循环过程中直接用remove()修改了原列表的长度。举个例子:
- 一开始
my_list是[1,2,3,4,5],长度是5,循环会从i=0跑到i=4 - 当你删除元素4后,
my_list变成[1,2,3,5],长度变成4 - 但循环还是会继续到
i=4,这时候my_list的最大索引是3,自然找不到索引4的元素,就触发了索引越界错误
给你两种解决方法,都能避开这个问题
方法一:收集需要保留的元素(更推荐)
这种方法不修改原列表,而是新建一个列表来存储需要保留的元素,完全不会有索引问题:
my_set = {1,2,3,4,5} your_set = {4,5,6,7,8,9,10} result_list = [] # 遍历my_set中的每个元素 for num in my_set: # 标记当前元素是否是两个集合的公共元素 is_common = False for num2 in your_set: if num == num2: is_common = True break # 找到公共元素就不用继续遍历了,节省时间 # 如果不是公共元素,就加入结果列表 if not is_common: result_list.append(num) my_set2 = set(result_list) print(my_set2) # 输出:{1, 2, 3}
方法二:倒序遍历列表索引
如果一定要在原列表上删除元素,可以倒序遍历索引。因为倒序处理时,删除后面的元素不会影响前面元素的索引位置:
my_set = {1,2,3,4,5} your_set = {4,5,6,7,8,9,10} my_list = list(my_set) your_list = list(your_set) # 从最后一个索引开始,倒序遍历到第一个索引(0) for i in range(len(my_list)-1, -1, -1): current_num = my_list[i] for num2 in your_list: if current_num == num2: my_list.remove(current_num) break my_set2 = set(my_list) print(my_set2) # 输出:{1, 2, 3}
额外小提示
其实Python集合本身有内置的差集方法,一行代码就能搞定:print(my_set - your_set),不过你是为了练习手动实现逻辑,上面的两种方法更适合你的练习需求~
备注:内容来源于stack exchange,提问作者Ömer Faruk Özdemir
相关产品推荐
相关产品推荐

