Python基础总结(八)(列表List)

Python中的列表和字符串都是序列类型,对字符串的一些操作在列表中同样适合。

1.创建一个列表的方式:

  list1 = list()
  list2 = list([2, 3, 4])
  list3 = list(["red", "green"])
  list4 = list(range(3, 6)) #[3, 4, 5]
  list5 = list("abcd")  #['a', 'b', 'c', 'd']

上面的表达式可以使用更简单的语法表示:

  list1 = []
  list2 = [2, 3, 4]
  list3 = ["red", "green"]
  list4 = [2, "three", 4]         #注意:一个列表里面可以包含不同类型的元素

2.常用的对列表的操作

其中s代表一个列表

操作 描述
x in s x在s序列中就返回true
x not in s x不在序列s中就返回true
s1 + s2 连接两个序列s1和s2
sn, ns n个序列s的连接
s[i] 序列的第i个元素
s[i: j] 序列下标i到j-1的片段
len(s) 序列的长度,元素个数
min(s) 序列中的最小元素
max(s) 序列中的最大元素
sum(s) 序列中所有元素的和
for loop 在for循环中从左到右反转元素
>,>=,<,<=,!=,= 比较两个序列

列表可以使用random模块中的shuffle函数随意排列列表中的元素。

3.列表解析

可以使用‘列表解析’转换列表中的值
例如:

>>> list1 = [x for x in range(5)]
>>> list1
[0, 1, 2, 3, 4]
>>> list2 = [0.5 * x for x in list1]
>>> list2
[0.0, 0.5, 1.0, 1.5, 2.0]
>>> list3 = [x for x in list2 if x < 1.5]
>>> list3
[0.0, 0.5, 1.0]

4. 列表常用的方法

append(x: object): None    #将元素x添加到列表结尾
count(x:object): int       #返回元素x在列表中出现的次数
extend(l:list): None       #将l列表中的元素添加到列表中
index(x: object): int      #返回元素x在列表中第一次出现的下标
insert(index: int, x:object): None #将元素x插入到列表的index处
pop(i): object             #删除指定下标的元素并返回它,如果没有指定i,则删除列表的最后一个元素
reverse() : None           #将列表中的所有元素反转
remove(x: object): None    #删除第一次出现的x
sort(): None             #以升序排列列表中的元素

5.将字符串分成列表

str类中的split方法,可指定分割的标志。例如:

>>> items = "the weather is cold today".split()
>>> items
['the', 'weather', 'is', 'cold', 'today']
>>> items = "2016/11/6".split("/")
>>> items
['2016', '11', '6']

6.对列表元素移位处理

没有现成的方法可以使用,但是可以写程序实现,例如左移一位:

def shift(list):
    temp = list[0]

    for i in range(1, len(list)):
        list[i - 1] = list[i]

    list[len(list) - 1] = temp
    print(list)
shift([1,2,3,4,5])  #结果是[2, 3, 4, 5, 1]

7. 复制列表

如果使用:

 list2 = list1

实际上是将list1的引用值赋给list2,在这条语句之后,list2和list1指向同一个列表,而原来的list2所指向的列表就变成了垃圾(garbage)。为了将list1完全的复制给list2,可以使用:

list2 = [x for x in list1]  或简化为: list2 = [] + list1

8. 将列表当作参数传递

因为列表是可变的,在函数内部可能会被改变。

9.将列表作为函数返回值

函数只会返回一个列表的引用值

10.列表的排序算法

  • 选择排序:

选择排序先从列表中找到最小的元素和列表的第一个元素进行交换,然后再从剩余的列表中找到最小的元素和剩余列表的第一个元素进行交换,直到只剩下一个元素。

def selectionSort(lst):
    for i in range(len(lst) - 1):
        currentMin = lst[i]
        currentMinIndex = i

        for j in range(i + 1, len(lst)):
            if currentMin > lst[j]:
                currentMin = lst[j]
                currentMinIndex = j

        if currentMinIndex != i:
            lst[currentMinIndex] = lst[i]
            lst[i] = currentMin
    return lst
def main():
    lst = [1, 3, 2,0,9,8.9, -1.0, -9.8, 4.5]  
    print(selectionSort(lst))   

main()  #结果[-9.8, -1.0, 0, 1, 2, 3, 4.5, 8.9, 9]

选择排序递归算法:

def selectionSort(lst):
    sortHelper(lst, 0, len(lst) - 1)
def sortHelper(lst, low, high):
    if low < high:
        indexOfMin = low
        min = lst[low]

        for i in range(low + 1, high + 1):
            if lst[i] < min:
                min = lst[i]
                indexOfMin = i

        lst[indexOfMin] = lst[low]
        lst[low] = min

        sortHelper(lst, low + 1, high)
def main():
    lst = [3, 2, 1, 5, 9, 0, -4.5]
    selectionSort(lst)
    print(lst)

main()  #结果:[-4.5, 0, 1, 2, 3, 5, 9]
  • 插入排序:

是将新元素重复的插入到已经排好序的子列表中。首先取出第一个元素当作一个已经排好顺序的子序列,然后依次从第二个开始和前面的子序列比较并插入到适当的位置上。

def insertionSort(lst):
    for i in range(1, len(lst)):
        currentElement = lst[i]
        k = i - 1
        while k >= 0 and lst[k] > currentElement:
            lst[k + 1] = lst[k]
            k -= 1
        lst[k + 1] = currentElement
    return lst
def main():
    lst = [1, 3, 2,0,9,8.9, -1.0, -9.8, 4.5]
    print(insertionSort(lst))

main()  #结果是:[-9.8, -1.0, 0, 1, 2, 3, 4.5, 8.9, 9]
  • 快速排序算法:
#array's quick sort
def quickSort(arr,i,j):
    if i < j:
        base = quick(arr, i, j)
        quickSort(arr, i, base)
        quickSort(arr, base+1, j)
    return arr
def quick(arr, i, j):
    base = arr[i]
    while i < j:
        while i < j and arr[j] > base:
            j-=1
        while i < j and arr[j] < base:
            arr[i] = arr[j]
            i+=1
            arr[j] = arr[i]
    arr[i] = base
    return i

def main():
    lst = [1, 3, 2, -1, 4.5, 999, 234, 0, -9.8]
    print(quickSort(lst, 0, len(lst)-1))
main()  #结果是[-9.8, -1, 0, 1, 2, 3, 4.5, 234, 999]

11.列表的查找算法

  • 线性查找法
    将关键字和列表中的每一个元素进行比较。适合列表元素数量较少,顺序任意的情况,因为比较简单就不给出程序实现了。
  • 二分查找法
    适合排好顺序的列表。假设列表是按照升序排列的,算法解释如下:
  • 如果关键字小于列表中间的元素,那么在列表前半部分继续寻找关键字
  • 如果关键字等于中间的元素,那么因为找到一个匹配元素而结束
  • 如果关键字大于列表中间的元素,那么在列表后半部分继续寻找关键字

假设在1024(2的10次幂)个元素中查找,最坏的情况需要11(log2(n)+1)次比较,而线性查找要进行1023次比较。显然二分查找更加高效:

def binarySearch(list, key):
    low = 0
    high = len(list) - 1


    while high >= low:
        mid = (low + high) // 2
        if key < list[mid]:
            high = mid - 1
        elif key == list[mid]:
            return mid
        else:
            low = mid + 1
    return -low - 1

list = [-9.8, -1.0, 0, 1, 2, 3, 4.5, 8.9, 9]
i = binarySearch(list, 6)
print(i)

这里函数的返回值的绝对值是要查找的值应该插入到列表中的位置,并且能保持列表升序排列的位置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容