list為python中的常用資料類型,其為python中內建類,繼承自object。接下來全面介紹list的常見方法及自己實作類別list功能的類
建立list
建立空list
list1 = []
list2 = list()
建立並初始化list
list1 = ['a','b','c',123] #比較常用,類型可以不一致
list2 = list(list1) #傳入的為可迭代對象,如set,tuple,generator
list3 = [i for i in range(10)] # 清單產生器
list4 = [x for x in range(10) if x % 2 == 0] # 產生偶數
list5 = [0] * 5 # 產生 [0, 0, 0, 0, 0] 常見方法
append
append(p_object) 向list末尾添加資料
list1 = []
list1.append('456')
len
len(list1) # 返回list1中元素個數
insert
insert(index, p_object) 向list指定位置(index)插入資料
list1.insert(3,'abc') # 當index 大於等於 list長度,向末尾插入
list1.insert(-2,'abc') # 負數為從後往前數 當index < len(list1) * -1,則為在頭部插入資料 pop
pop(index=None) 彈出指定位置(index)的資料,當index >= len(list1) or index < len(list1) * -1,拋出異常
list1.pop(1)
list1.pop() #彈出末尾資料 remove
remove(value) 移除list中的指定元素,如果list為空白或者指定元素在列表中不存在,拋出異常
list1.remove('abc')
clear
列表清空 index
index( value, start=None, stop=None) 尋找指定元素 sort
對list中元素進行排序 count
count(value) 統計元素出現的次數,較複雜的統計建議通過 from collections import Counter 進行統計 extend
extend(iterable) 對list進行擴充
ist1.extend(list2) # lis2中內容添加至list1後,也可以使用list1 + list2 reverse
對list資料進行反轉
list.reverse() # 從['A','B','C'] 變成 ['C','B','A'] copy
對原始list進行拷貝,產生新的list 遍曆
list1 = [x for x in range(0,10,2)] for i in range(len(list1)): print(list1[i], end=' ') print() for x in list1: print(x, end=' ') print() for ind,value in enumerate(list1): print(ind, value, sep='=', end = ' ')
尋找
list的尋找主要使用切片 切片(slice)
slice為python中內建函數
s1 = slice(0,1) #[0:1] 從0開始,1結束(不包括)
s2 = slice(4) #[0:4]
s3 = slice(0,10,2) #[0:10:2],從0開始,10結束,每次取數中間隔一個值
list1 = [x for x in range(10)]
list1[s1]
list1[0:10:2]
list1[::] #查詢所有元素
list1[5] #取下標為5的數 傳入的為int類型
list1[-5:-2] #也可以取負數 實現list類
這裡採用鏈表進行實現。LinkedList包含size,start,end等屬性和Node類,其中size表示包含Node節點的個數,start為開始節點,end為結束節點。Node類包含pre,next,data屬性,pre的值為前一個Node節點,next的值為後一個節點,data中為放入的資料資訊
#!/usr/bin python3 # -*- coding:utf-8 -*- class LinkedList(object): # 節點類 class __Node(object): def __init__(self, data, pre, next): self.pre = pre # 向前節點 self.next = next # 向後節點 self.data = data # 資料 # 初始化 size,開始、結束節點屬性 def __init__(self): self.__size = 0 self.__start = None self.__end = None # 添加資料 def append(self, data): last_node = self.__end node = self.__Node(data, last_node, None) if self.__size == 0: self.__start = node else: last_node.next = node self.__end = node self.__size += 1 # 插入資料 def insert(self, index, data): if index >= self.__size: # 末尾添加 self.append(data) return elif index <= self.__size * -1 or index == 0: # 開頭添加 next_node = self.__start node = self.__Node(data, None, next_node) next_node.pre = node self.__start = node else: # 中間添加 next_node = self.__get_node(index) pre_node = next_node.pre node = self.__Node(data, pre_node, next_node) pre_node.next = node next_node.pre = node self.__size += 1 # 彈出資料 def pop(self, index=None): if index is None: index = self.__size - 1 if self.__size == 0: raise IndexError('pop from empty list') if index >= self.__size or index < self.__size * -1: raise IndexError('pop index out of range') pop_node = self.__get_node(index) pre_node = pop_node.pre next_node = pop_node.next if pre_node is None: # 彈出的為 開前端節點 next_node.pre = None self.__start = next_node pop_node.next = None elif next_node is None: # 彈出的為 末尾節點 pre_node.next = None self.__end = pre_node pop_node.pre = None else: pop_node.pre = None pop_node.next = None pre_node.next = next_node next_node.pre = pre_node self.__size -= 1 # 刪除元素 def remove(self, obj): pos = None for ind, value in enumerate(self): if value == obj: pos = ind break &nbs