列表和元組

# coding:utf-8python

#--------------------------------------   通用序列操做  -----------------------------------------------web

#索引app

greeting = 'Hello'dom

print greeting[0]          #第一位是0ide

#H函數

print greeting[-1]          #最後一位是-1,不是-0this

#ourl

print 'Hello'[1]            #字符串字面值直接使用索引,和上面方法效果同樣spa

#ecode

#fourth = raw_input('Year: ')[3]     #函數返回序列使用索引,只拿取第四位字符

#Year: 2005

#print fourth

#5

#實例腳本詳見date.py

#分片

#分片經過冒號隔開的兩個索引來實現:

tag = '<a href="http://www.python.org">Python web site<\a>'

print tag[9:30]

#http://www.python.org

print tag[32:-4]

#Python web sit

numbers = [1,2,3,4,5,6,7,8,9,10]

print numbers[3:6]

#[4, 5, 6]

print numbers[0:1]

#[1]

print numbers[7:10]     #索引10指向第11個元素,這個元素不存在,倒是在最後一個元素以後

#[8, 9, 10]

print numbers[-3:-1]   #倒數方式,沒法取得最後一位

#[8, 9]

print numbers[-3:]     #取得最後一位方式

#[8, 9, 10]

print numbers[:3]      #從第一位開始

#[1, 2, 3]

print numbers[:]

#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#腳本例子

#對http://www.abc.com 形式的URL進行分割

#url = raw_input('Please enter the URL: ')        #須要輸入URL,好比http://www.abc.com

#domain = url[11:-4]

#print "Domain name: " + domain

#Please enter the URL: http://www.abc.com

#Domain name: abc

#更大的步長

numbers = [1,2,3,4,5,6,7,8,9,10]

print numbers[0:10:1]       #步長爲1

#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print numbers[0:10:2]      #步長爲2

#[1, 3, 5, 7, 9]

print numbers[3:6:3]

#[4]

print numbers[::4]          #每4個元素第一個提取出來

#[1, 5, 9]

print numbers[8:3:-1]       #步長負數就是倒着來

#[9, 8, 7, 6, 5]

print numbers[10:0:-2]

#[10, 8, 6, 4, 2]

print numbers[0:10:-2]      #步長負數正着來沒法顯示

#[]

print numbers[::-2]

#[10, 8, 6, 4, 2]

print numbers[5::-2]

#[6, 4, 2]

print numbers[:5:-2]

#[10, 8]

#序列相加

numbers = [1,2,3] + [4,5,6]

print numbers

#[1, 2, 3, 4, 5, 6]

numbers = 'Hello, ' + 'world!'

print numbers

#Hello, world!

#numbers = [1,2,3] + 'word!'     #列表和字符串沒法鏈接一塊兒,會報錯

#print numbers

#乘法

print 'python' * 5      #重複5次

#pythonpythonpythonpythonpython

print [42] * 10

#[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]

sequence = [None] * 10      #None表明空列表

print sequence

#[None, None, None, None, None, None, None, None, None, None]

#判斷成員資格

#爲了檢查一個值是否在序列中,可使用in運算符。

permissions = 'rw'

if 'w' in permissions: print True

#True

if 'x' not in permissions: print False

#False

#users = ['mlh', 'foo', 'bar']

#if raw_input('Enter your user name: ') in users: print True

#Enter your user name: mlh

#True

subject = '$$$ Get rich now!!! $$$'

if '$$$' in subject: print True

#True

database = [

   ['albert', '1234'],

   ['dilbert', '4242'],

   ['smith', '7524'],

   ['jones', '9843']

]

#username = raw_input('User name: ')

#pin = raw_input('PIN code: ')

#if [username, pin] in database: print 'Access granted'

#User name: albert

#PIN code: 1234

#Access granted

#長度最小值最大值

numbers = [100, 34, 678]

print len(numbers)      #元素的數量

#3

print max(numbers)      #最大的元素

#678

print min(numbers)      #最小的元素

#34

print max(2, 3)         #顯示最大元素

#3

print min(9, 3, 2, 5)   #顯示最小元素

#2

#--------------------------------------------------   列表  -------------------------------------------------------

#列表是可變的,可修改。

#list函數

print list('Hello')                         #字符串轉換列表

#['H', 'e', 'l', 'l', 'o']

print ''.join(['H', 'e', 'l', 'l', 'o'])   #列表轉換字符串

#Hello

#基本列表操做

#改變列表:元素賦值

x = [1, 1, 1]           #不能爲一個位置不存在的元素進行賦值。若是列表長度爲2,那麼不能爲索引爲100的元素賦值。若是要那樣作,就必須建立一個長度爲101或者更長的列表。

x[1] = 2

print x

#[1, 2, 1]

#刪除元素

names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl']

del names[2]        #除了刪除列表中的元素,del還能夠刪除其餘元素,好比字典元素或是其餘變量元素。

print names

#['Alice', 'Beth', 'Dee-Dee', 'Earl']

#分片賦值

name = list('Perl')

print name

#['P', 'e', 'r', 'l']

name[2:] = list('ar')

print name

#['P', 'e', 'a', 'r']

name = list('Perl')

name[1:] = list('ython')

print name

#['P', 'y', 't', 'h', 'o', 'n']

numbers = [1, 5]

print numbers

#[1, 5]

numbers[1:1] = [2, 3, 4]        #能夠在不須要替換任何原有元素的狀況插入新的元素

print numbers                   #這個程序只是「替換」了一個空的分片,所以實際的操做是插入了一個序列。

#[1, 2, 3, 4, 5]

numbers[1:4] = []           #經過分片賦值來刪除元素

print numbers

#[1, 5]

numbers[1:-1] = [2, 3, 4]

print numbers

#[1, 2, 3, 4, 5]

del numbers[1:-2]

print numbers

#[1, 4, 5]

numbers[1:-2] = [2, 3]

print numbers

#[1, 2, 3, 4, 5]

#列表方法

#方法調用:對象.方法(參數)

#append追加

lst = [1, 2, 3]         #不能夠用內建函數list做爲變量

lst.append(4)           #在列表末尾追加新的對象

print lst

#[1, 2, 3, 4]

#count統計

#count方法統計某個元素在列表中出現的次數

print ['to', 'be', 'or', 'not', 'to', 'be'].count('to')

#2

x = [[1, 2], 1, 1, [2, 1, [1, 2]]]

print x.count(1)

#2

print x.count([1,2])

#1

#extend追加列表

#extend方法能夠在列表的末尾一次性追加另外一個序列中的多個值。換句話說,能夠用新列表擴展原有的列表:

a = [1, 2, 3]

b = [4, 5, 6]

a.extend(b)

print a

#[1, 2, 3, 4, 5, 6]

#這個操做看起來很像鏈接操做,二者最主要區別在於:extend方法修改了被擴展的序列(在這個例子中,就是a)。而原始的鏈接操做則否則,它會返回一個全新的列表。

a = [1, 2, 3]

b = [4, 5, 6]

c =  a + b

print a

#[1, 2, 3]

print c

#[1, 2, 3, 4, 5, 6]

a = a + b           #這樣的並無被修改,而是建立了一個a和b副本的新列表,這樣的方式效率比較低。

print a

#[1, 2, 3, 4, 5, 6]

a = [1, 2, 3]

b = [4, 5, 6]

a[len(a):] = b      #咱們可使用分片賦值來實現相同結果,但代碼可讀性就不如使用extend方法

print a

#[1, 2, 3, 4, 5, 6]

#index 查找索引

#index方法用於從列表中找出某個值第一個匹配項的索引位置:

knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni']

print  knights.index('who')

#4

print knights[knights.index('who')]         #同等於print knights[4]

#who

#insert 插入對象

#insert方法用於將對象插入到列表中:

numbers = [1, 2, 3, 5, 6, 7]

numbers.insert(3, 'four')

print numbers

#[1, 2, 3, 'four', 5, 6, 7]

#與extend方法同樣,insert方法的操做也能夠用分片賦值來實現。

numbers = [1, 2, 3, 5, 6, 7]

numbers[3:3] = ['Four']         #可讀性不如insert

print numbers

#[1, 2, 3, 'four', 5, 6, 7]

#pop 移除元素

#pop方法會移除列表中的一個元素(默認是最後一個),而且返回該元素的值:

x = [1, 2, 3]

print x.pop()         #默認刪除最後一個

#3

print x

#[1, 2]

print x.pop(0)

#1

print x

#[2]

#棧,先進後出FIFO隊列。就是頂部放入,底部移出。入棧(push)和出棧(pop),python沒有入棧方法,能夠用append也能夠用insert(0,...)替代。出棧能夠用pop

#remove 移除第一個匹配的元素

x = ['to', 'be', 'or', 'not', 'to', 'be']

x.remove('be')      #能夠看到remove是一個沒有返回值的原位置改變方法,它修改了列表卻沒有返回值,這與pop方法相反。

print x

#['to', 'or', 'not', 'to', 'be']

#reverse 反向存放

x = [1, 2, 3]

x.reverse()         #reverse不返回值,就像remove和sort

print x

#[3, 2, 1]

#sort 排序

#sort方法用於在原位置對列表進行排序。在「原位置排序」意味着改變原來的列表,從而讓其中的元素按必定的順序排序,而不是簡單地返回一個已排序的列表副本。

x = [4, 6, 2, 1, 7, 9]

x.sort()            #x變量的列表已經被修改,但不會返回值。

print x

#當用戶須要一個排好序的列表副本,同時又保留原有列表不變的時候,問題就出現了:

x = [4, 6, 2, 1, 7, 9]

y = x.sort()         #Don't do this!

print y

#None

#由於sort方法修改了x卻返回了空值,那麼最後獲得的是已排序的x以及值爲None的y。實現這個功能正確方法是,首先把x的副本賦值給y,而後對y進行排序:

x = [4, 6, 2, 1, 7, 9]

y = x[:]

y.sort()

print x                #保留x變量

#[4, 6, 2, 1, 7, 9]

print y                #顯示y變量的排序

#[1, 2, 4, 6, 7, 9]

#再次調用x[:]獲得的是包含了x全部元素的分片,這是一種頗有效率的複製整個列表的方法。只是簡單的把x賦值給y是沒用的,由於這樣作讓x和y都指向同一個列表了。

y = x           #指向了同一個列表

y.sort()        #x和y是同一個列表,因此列表排序後,x和y都會被排序。

print x

#[1, 2, 4, 6, 7, 9]

print y

#[1, 2, 4, 6, 7, 9]

#另外一種獲取已排序的列表副本方法是sorted函數:

x = [4, 6, 2, 1, 7, 9]

y = sorted(x)

print x         #x的列表保留不變

#[4, 6, 2, 1, 7, 9]

print y

#[1, 2, 4, 6, 7, 9]

#想把一些元素按相反方向的順序排列,能夠先使用sort(或者sorted),而後調用reverse方法。

#注意須要分兩次調用,若是打算經過x.sort().reverse()來實現,會發現行不通,由於x.sort()返回的是None空值。正確方法:

x = [4, 6, 2, 1, 7, 9]

x = sorted(x)

x.reverse()

print x

#高級排序

print cmp(42, 32)    #42比32大,返回正數

#1

print cmp(99, 100)   #99比100小,返回負數

#-1

print cmp(10, 10)    #相等返回0

#0

numbers = [5, 2, 9, 7]

numbers.sort(cmp)      #根據cmp函數方式排序

print numbers

#[2, 5, 7, 9]

x = ['aardvark', 'abalone', 'acme', 'add', 'aerate']

x.sort(key=len)         #根據key進行排序,key須要建立一個鍵函數,根據len鍵字符長度排序

print x

#['add', 'acme', 'aerate', 'abalone', 'aardvark']

x = [4, 6, 2, 1, 7, 9]

x.sort(reverse=True)    #reverse反向排序,指明True反向排序,指明False正向排序

print x

#[9, 7, 6, 4, 2, 1]

#--------------------------------   元組   ---------------------------------------------------

#元素不可變,沒法修改

#建立元組

x = 1, 2, 3

print x

#(1, 2, 3)

x = (1, 2, 3)

print x

#(1, 2, 3)

x = ()          #空元組

print x

#()

x = 42,         #一個值的元組,也須要逗號

print x

#(42,)

x = (42, )

print x

#(42,)

x = 42          #沒有逗號不是元組

print x

#42

x = 3*(40+2)      #不是元組

print x

#126

x = 3*(40+2, )    #是元組。逗號很重要,加個逗號能完全改變表達式的值。

print x

#(42, 42, 42)

#tuple 轉換爲元組

print tuple([1, 2, 3])      #列表轉換元組

#(1, 2, 3)

print tuple('abc')          #字符串轉換元組

#('a', 'b', 'c')

print tuple((1, 2, 3))      #自己是元組,返回一樣元組

#(1, 2, 3)

#元組基本操做

#元組其實並不複雜--除了建立元組的訪問元組元素以外,沒有太多其餘操做。

x = 1, 2, 3

print x[1]

#2

print x[0:2]                #元組的分片仍是元組,就像列表的分片仍是列表同樣

#(1, 2)


#涉及的函數

#cmp(x,y)           #比較兩個值

#len(seq)           #返回序列的長度

#list(seq)          #把序列轉換成列表

#max(args)          #返回序列或者參數集合中的最大值

#min(args)          #返回序列或者參數集合中的最小值

#reversed(seq)      #對序列進行反向迭代

#sorted(seq)        #返回已排序的包含seq全部元素的列表

#tuple(seq)         #把序列轉換成元組

相關文章
相關標籤/搜索