列表和元組 、 字典 、 集合
列表
>> > from random import randint
>> > l1 = [ randint( 1 , 100 ) for i in range ( 10 ) ]
>> > l1
[ 47 , 95 , 14 , 21 , 28 , 80 , 23 , 98 , 17 , 37 ]
>> > l1[ 0 ] = 80
>> > l1[ 2 : 4 ] = [ 10 , 50 , 20 , 80 ]
>> > l1
[ 80 , 95 , 10 , 50 , 20 , 80 , 28 , 80 , 23 , 98 , 17 , 37 ]
>> > l1. append( 80 )
>> > l1. insert( 0 , 20 )
>> > l1. extend( [ 10 , 20 , 30 ] )
>> > l1. append( [ 10 , 20 , 30 ] )
>> > l1. pop( )
>> > l1. index( 98 )
>> > l1. pop( 10 )
>> > l1. remove( 20 )
>> > l1. sort( )
>> > l1. reverse( )
>> > l1. count( 80 )
>> > l2 = l1
>> > l2
[ 95 , 80 , 80 , 80 , 80 , 50 , 37 , 30 , 28 , 23 , 20 , 20 , 17 , 10 , 10 ]
>> > while 80 in l2:
. . . l2. remove( 80 )
>> > l2
[ 95 , 50 , 37 , 30 , 28 , 23 , 20 , 20 , 17 , 10 , 10 ]
>> > l1
[ 95 , 50 , 37 , 30 , 28 , 23 , 20 , 20 , 17 , 10 , 10 ]
>> > l3 = l1. copy( )
>> > l1. clear( )
>> > l3
[ 95 , 50 , 37 , 30 , 28 , 23 , 20 , 20 , 17 , 10 , 10 ]
元組
屬於容器、不可變、順序類型
元組相當於是不可變的列表
>> > t1 = ( 10 , 20 , 30 , 20 , 100 )
>> > t1. count( 20 )
2
>> > t1. index( 30 )
2
>> > t2 = ( 10 )
>> > type ( t2)
< class 'int' >
>> > t2
10
>> > t3 = ( 10 , )
>> > type ( t3)
< class 'tuple' >
>> > t3
( 10 , )
>> > len ( t3)
1
練習1:列表模擬棧結構
stack = [ ] 首先定義一個存儲數據的列表
def push_it ( ) :
data = input ( '數據:' ) . strip( ) strip去除字符串兩端空格
if not data:
print ( '格式錯誤,請重新嘗試' )
stack. append( data)
def pop_it ( ) :
def pop_it ( ) :
if [ ] == stack:
print ( '空' )
else :
print ( '從棧中彈出了% s' % stack. pop( ) )
def view_it ( ) :
print ( stack)
def menu_it ( ) :
promat = """(0)壓棧
(1)出棧
(2)查詢
(3)退出
請選擇(0/1/2/3)"""
while 1 :
show_menu( ) :
"用於在屏幕上打印菜單,根據用戶選擇調用相關函數"
dic = { '0' : push_it, '1' : pop_it, '2' : view_it} 定義一個字典用來調用函數
xz = input ( promat) . strip( )
if xz not in [ '0' , '1' , '2' , '3' ] :
print ( '格式錯誤,請重試' )
return
if xz == '3' :
print ( 'bye' , 'bye' )
break
dic[ xz] ( ) 通過字典的key來獲取value。
if __name__ == '__main__' :
menu_it( )
字典
屬於容器、可變、映射類型
字典的key不能重複
通過key進行賦值時,如果key已在字典中則修改值;如果key不在字典中,則新增值
字典的key,必須是不可變類型
>> > d1 = { 'name' : 'tom' , 'name' : 'bob' }
>> > d1
{ 'name' : 'bob' }
>> > d1[ 'name' ] = 'jerry'
>> > d1
{ 'name' : 'jerry' }
>> > d1[ 'age' ] = 20
>> > d1
{ 'name' : 'jerry' , 'age' : 20 }
>> > d1[ ( 100 , 200 ) ] = 'home'
>> > d1
{ 'name' : 'jerry' , 'age' : 20 , ( 100 , 200 ) : 'home' }
>> > d1[ [ 100 , 200 ] ] = 'home'
>> > len ( d1)
3
>> > 20 in d1
False
>> > 'age' in d1
True
>> > d1[ 0 ]
>> > d2 = dict ( [ ( 'name' , 'tom' ) , ( 'qq' , '12345243' ) , ( 'email' , '[email protected] ' ) ] )
>> > d2
{ 'name' : 'tom' , 'qq' : '12345243' , 'email' : '[email protected] ' }
>> > d3 = { } . fromkeys( [ 'tom' , 'jerry' , 'bob' , 'alice' ] , 20 )
>> > d3
{ 'tom' : 20 , 'jerry' : 20 , 'bob' : 20 , 'alice' : 20 }
>> > for k in d2:
. . . print ( k, d2[ k] )
>> > d2. get( 'name' )
'tom'
>> > print ( d2. get( 'phone' ) )
None
>> > print ( d2. get( 'phone' , 'not found' ) )
not found
>> > print ( d2. get( 'email' , 'not found' ) )
tom@tedu. cn
>> > d2. keys( )
dict_keys( [ 'name' , 'qq' , 'email' ] )
>> > list ( d2. keys( ) )
[ 'name' , 'qq' , 'email' ]
>> > d2. values( )
dict_values( [ 'tom' , '12345243' , '[email protected] ' ] )
>> > list ( d2. items( ) )
[ ( 'name' , 'tom' ) , ( 'qq' , '12345243' ) , ( 'email' , '[email protected] ' ) ]
>> > d2. pop( 'qq' )
'12345243'
>> > d2. update( { 'city' : 'shenzhen' , 'age' : 20 } )
>> > d2
{ 'name' : 'tom' , 'email' : '[email protected] ' , 'city' : 'shenzhen' , 'age' : 20 }
練習2:字典使用的練習
import getpass
users = { }
def register ( ) :
user = input ( '請輸入用戶名:' ) . strip( )
if user in users:
print ( '\033[32m;1m用戶以存在\033[0m' )
elif not user:
print ( '\033[32;1m用戶名不能爲空\033[0m' )
else :
password = getpass. getpass( '密碼:' )
users[ user] = password
print ( '\033[32;1m註冊成功\033[0m' )
def login ( ) :
username = input ( '用戶名:' )
password = getpass. getpass( '密碼:' )
if users. get( username) == password:
print ( '\033[32;1mLogin sussfull\033[0m' )
break
else :
print ( '\033[31;1mLogin error\033[0m' )
def show_menu ( ) :
promat = """(1)註冊:
(2)登陸:
(3)退出
請選擇(0/1/2):"""
funs = { '1' : register, '2' : login}
while 1 :
xz = input ( promat) . strip( )
if xz not in { '1' , '2' , '3' } :
print ( '格式錯誤' )
continue
if xz == '3' :
print ( 'Bye...' )
break
funs[ xz] ( )
if __name__ == '__main__' :
show_menu( )
測試運行
[ root@python day5]
( 1 ) 註冊:
( 2 ) 登陸:
( 3 ) 退出
請選擇( 0 / 1 / 2 ) : 1
請輸入用戶名: wenhao
密碼: 此處不顯示密碼是因爲調用了getpass. getpass
註冊成功
( 1 ) 註冊:
( 2 ) 登陸:
( 3 ) 退出
請選擇( 0 / 1 / 2 ) : 2
用戶名: bob
密碼:
Login error
( 1 ) 註冊:
( 2 ) 登陸:
( 3 ) 退出
請選擇( 0 / 1 / 2 ) : 2
用戶名: wenhao
密碼:
Login sussfull
( 1 ) 註冊:
( 2 ) 登陸:
( 3 ) 退出
請選擇( 0 / 1 / 2 ) : 3
Bye. . .
集合
數學上,集合set是由不同元素構成的
集合中數據,被稱作集合元素。集合元素都是不可變對象。
集合沒有順序
集合就像是一個無值的字典
集合分成可變集合set,和不可變集合frozenset
>> > s1 = { 10 , 20 , 30 , 'abc' , 'tom' , 'jerry' }
>> > type ( s1)
< class 'set' >
>> > s1
{ 10 , 'jerry' , 'abc' , 20 , 'tom' , 30 }
>> > s2 = set ( [ 10 , 20 , 30 , 40 , 50 ] )
>> > s2
{ 40 , 10 , 50 , 20 , 30 }
>> > s3 = set ( 'abc' )
>> > s4 = set ( 'bcd' )
>> > s3
{ 'c' , 'b' , 'a' }
>> > s4
{ 'd' , 'c' , 'b' }
>> > len ( s2)
5
>> > for i in s2:
. . . print ( i)
>> > 20 in s2
True
>> > 100 not in s2
True
>> > s3 & s4
{ 'c' , 'b' }
>> > s3 | s4
{ 'd' , 'c' , 'b' , 'a' }
>> > s3 - s4
{ 'a' }
>> > s4 - s3
{ 'd' }
>> > s2. add( 100 )
>> > s2. pop( )
100
>> > s2. remove( 50 )
>> > s3. union( s4)
{ 'd' , 'c' , 'b' , 'a' }
>> > s3. intersection( s4)
{ 'c' , 'b' }
>> > s3. difference( s4)
{ 'a' }
>> > s5 = s3. union( s4)
>> > s3. issubset( s5)
True
>> > s5. issuperset( s3)
True
>> > from random import randint
>> > nums = [ randint( 1 , 50 ) for i in range ( 20 ) ]
>> > nums
[ 36 , 41 , 6 , 44 , 45 , 30 , 48 , 20 , 45 , 50 , 25 , 28 , 39 , 20 , 14 , 22 , 24 , 4 , 18 , 44 ]
>> > set ( nums)
{ 36 , 4 , 6 , 39 , 41 , 44 , 45 , 14 , 48 , 50 , 18 , 20 , 22 , 24 , 25 , 28 , 30 }
>> > list ( set ( nums) )
[ 36 , 4 , 6 , 39 , 41 , 44 , 45 , 14 , 48 , 50 , 18 , 20 , 22 , 24 , 25 , 28 , 30 ]
>> > result = [ ]
>> > for i in nums:
. . . if i not in result:
. . . result. append( i)
練習3:找到mima中有passwd中沒有的行
[ root@localhost day05]
[ root@localhost day05]
[ root@localhost day05]
>> > with open ( '/tmp/mima' ) as f1:
. . . s1 = set ( f1)
>> > with open ( '/tmp/passwd' ) as f2:
. . . s2 = set ( f2)
>> > s3 = s1 - s2
>> > s3
{ 'how are you?\n' , 'hello world!\n' }
>> > with open ( '/tmp/result.txt' , 'w' ) as f3:
. . . f3. writelines( s3)
[ root@localhost day05]
how are you?
hello world!