|
发表于 2021-12-14 14:27:44
|
显示全部楼层
本帖最后由 gonff 于 2021-12-14 14:51 编辑
首先是问题,
直接看奇数部分:首先k的迭代是按照k[0], k[1], k[2]...这样的顺序。
当k被移除元素后,后面的元素会顶替前面的序号: 原本的k=[2, 6, 9, 10, 18, 34, 36, 45, 62, 91], 那么k[0]=2, k[1]=6, k[3]=9... 当你执行第一次循环移除i=k[0],也就是2之后,k=[6, 9, 10, 18, 34, 36, 45, 62, 91],此时k[0]=6, k[1]=9, k[2]=10
于是第二次循环,i=k[1],也就是9。6被跳过了。
依次类推,你会发现每遇到一个偶数,迭代的i会跳过一个元素,于是6和18,36因为有2和10,34在前,都被留下来了。其实91也没有被执行,不过本来就是奇数不影响结果。
结果来说,如果有2连续的偶数,就会漏掉一个。
偶数部分没问题是因为没有两个连一起的奇数,所以只是结果符合,实际执行时还是有几个元素没有被迭代执行。
解决办法,还是用list的append方法,遇到偶数就List1.append(i),遇到奇数就List2.append(i)。这样只需要一个if else就搞定了,也不需要k,只用m即可(也可以把迭代直接写成for i in sorted(n, reverse=False))还精简了语句。大概这个感觉
- >>> n = [2, 6, 45, 9, 34, 10, 91, 62, 36, 18]
- >>> List1 = []
- >>> List2 = []
- >>> for i in sorted(n, reverse=False):
- if i%2:
- List2.append(i)
- else:
- List1.append(i)
-
- >>> print(List1)
- [2, 6, 10, 18, 34, 36, 62]
- >>> print(List2)
- [9, 45, 91]
- >>>
复制代码
前面是延续你的思路进行改进,不过我看你的题目里,似乎不需要从小到大排序,只要把奇偶分开就行?而且要求用sorted(),那只需要一两句话句话搞定: - n = eval(input())
- sorted(n, key=lambda x:x%2==0)
复制代码
结果如下
- >>> n = eval(input())
- [2, 6, 45, 9, 34, 10, 91, 62, 36, 18]
- >>> sorted(n, key=lambda x:x%2==0)
- [45, 9, 91, 2, 6, 34, 10, 62, 36, 18]
- >>>
复制代码 |
|