暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【PCAP考试】lists内元素对换和sort

学之初 学之时 2021-04-08
536


课程(免费)来源:
PCAP - Programming Essentials In Python 
English 0321b
撰文/Iris帆
排版/Iris帆
全文/1920字


序言

本期分享的内容跟Python入门第一课之数据结构(上)关联,要是对lists的基本概念和运用有所遗忘,记得首先回顾!


本期分享对所举例子有比较详细的分析和解释 (今天不懒)。


内容短小精悍,方便“食用”。




1
元素交换


variables进行赋值,可以将赋值进行交换。同样地,在一个list内部,各元素的值是可以进行交换的,比如我想要将index为0的值与index为4的值进行对调。


下面的例1和例2充分解释了其意思:


#例1
variable_1 = 1
variable_2 = 2
variable_1, variable_2 = variable_2, variable_1
print(variable_1, variable_2)
#输出:2 1


#例2
my_list = [10, 1, 8, 3, 5]
my_list[0], my_list[4] = my_list[4], my_list[0]
my_list[1], my_list[3] = my_list[3], my_list[1]
print(my_list)
#输出:[5, 3, 8, 1, 10]


#例3
my_list = [10, 1, 8, 3, 5]
length = len(my_list)
for i in range(length 2):
    my_list[i], my_list[length - i - 1] = my_list[length - i - 1], my_list[i]
print(my_list)
#输出:[5, 3, 8, 1, 10]


例2展示了将list中的0号位与4号位对调,再将1号位和3号位对调,其书写形式是比较容易理解的。除此之外,我们还能用例3的方法得到与例2相同的结果。


首先我们明确一下例2和例3的目的本质上我们期望的是将list的整个顺序倒置过来,也就是从[10, 1, 8, 3, 5]变成[5, 3, 8, 1, 10]。


例2展示的方法适用于这样简短的list,但假设我们面对的是高达100个元素的list,这样的方法就显得生硬。所以,我们将引入for loop来实现,并将例2的方法融入进去。


小提醒:例3不仅适用于把[10, 1, 8, 3, 5]变成[5, 3, 8, 1, 10]这一个例子,而适用于将list的整个顺序倒置这一类例子。


从例3的coding结构来看,有以下几个关键点:


  • length//2:用到的整除,这样可以避免整个list内元素个数为奇数
  • 将list的整个顺序倒置,其实就是一步步将list中的元素首尾进行交换的过程


理解了以上的点,对例3的方法也就基本掌握了。


2
手动sort排序


Python入门第一课之数据结构(上)提到一个list.sort() function可以很简便地将lists内的数值进行排序,不过掌握了简单的方法,还是回来看看真正的sorting是如何进行的。


和上面讲将list的整个顺序倒置,就是将list中的元素首尾进行交换的过程的思维类似,我们要sort一个list,比如按数字由小到大的顺序」,本质上其实是将前一个元素和后一个元素的大小进行比较。如果前一值大于后一值,就将其进行对调,以此类推。


简单来说,就是比较各个元素的大小问题


下面的例1给出list[8, 10, 6, 2, 4],我们用比较大小的思维先来分析一下。


真正的运行过程,是从第一个元素开始的,在这个例子中第1个元素是8,我们来看看人脑如何进行由小到大的排序思维过程


  • 8和10比较,8<10,没得说8还是放在第一位,此时得到的顺序是[8, 10, 6,  2, 4]
  • 10和6比较,10>6,小的要放在前面,所以对调,此时得到的顺序是[8, 6, 10, 2, 4]
  • 10和2比较,10>2,对调,此时得到的顺序是[8, 6, 2,10, 4]
  • 10和4 比较,10>4,对调,此时得到的顺序是[8, 6, 2, 4, 10]


[8, 6, 2, 4, 10]就是我们第1轮通过比较完成的结果,下面的例1就是coding的部分,做的事情和我刚刚用到的「人脑排序思维」一样,只是翻译成了代码。


结合上面的排序思维过程,我们来分析一下例1coding的重点:


  • (len(my_list) - 1:我们要做4次比较
  • 比较大小和元素交换的结合

#例1
my_list = [8, 10, 6, 2, 4]  # list to sort


for i in range(len(my_list) - 1):  # we need (5 - 1) comparisons
    if my_list[i] > my_list[i + 1]:  # compare adjacent elements
        my_list[i], my_list[i + 1] = my_list[i + 1], my_list[i]  # If we end up here, we have to swap the elements.
print(my_list)
#输出:[8, 6, 2, 4, 10]


刚才我们只进行了1轮的比较,并没有得到所期望的输出,因为第1个元素8并不是最小的值。


下面的例2可达到期望输出。


while和for loop的时候提到,while只要条件成立,循环持续进行的属性,而for对应的是1个条件的执行,完成后不会重头再来。


将这个观念纳入sorting例子可以理解为:
for可以让「比较和排序在一个条件下执行1轮」,而while则可以在「条件成立的情况下,持续保持几轮的执行」。


#例2
my_list = [8, 10, 6, 2, 4]  # list to sort
swapped = True  # It's a little fake, we need it to enter the while loop.


while swapped:
    swapped = False  # no swaps so far
    for i in range(len(my_list) - 1):
        if my_list[i] > my_list[i + 1]:
            swapped = True  # a swap occurred!
            my_list[i], my_list[i + 1] = my_list[i + 1], my_list[i]
print(my_list)
#输出:[2, 4, 6, 8, 10]


所以,为到达期望输出,使用了例2的whileloop,同样的我们来分析一下例2coding的重点:


  • swapped在code里就像一个“开关”一样,首先它表示的是True,我们可以引申为“”,那么False就引申为“”了。
  • whileloop开始,swapped = False表示元素交换还没开始,是“关闭”状态
  • for loop的前半部分和上面例1一样,唯一不同的就是swapped = True,表示一次交换可以“开始
  • 接着my_list[i], my_list[i + 1] = my_list[i + 1], my_list[i]就是具体交换的部分了
  • 只要swapp = True,就表示可以进行交换,但是当swapp = False时,也就是list内部可以交换的元素都已经进行完毕了,while loop就停止循环,随即输出最后结果


今天的分享就到这里了,感谢学习路上的你我TA!



扫码关注我吧

学之初 学之时
我努力前行,想在停下来的时候,把人生经验分享给您


文章转载自学之初 学之时,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论