數據類型-數據集
一、基本數據類型——列表
列表的定義:
定義:[] 內以逗號分隔,按照索引,存放各種數據類型,每個位置代表一個元素
列表的創建:
list_test=['張三', '李四', '王五']
或
list_test = list('王五')
列表的特點和常用操作
特性:
1. 可存放多個值
2. 按照從左到右的順序定義列表元素,下標從0開始順序訪問,有序
3. 可修改指定索引位置對應的值,可變
常用操作:
# 索引
i = ['egon', 'test', 'seven', 'mike'] print(i[0])
# 切片
i[0:2]
['egon', 'test']
>>> i[2:5]
['seven', 'mike']
>>> i[:2]
['egon', 'test']
>>> i[::2]
['egon', 'seven']
>>> i[::-1]
['mike', 'seven', 'test', 'egon']
# 追加
>>> i.append('eve')
>>> i
['egon', 'test', 'seven', 'mike', 'eve']
# 刪除
>>> i.remove('eve')
>>> i
['egon', 'test', 'seven', 'mike']
>>> i.pop()
'mike'
# 長度
>>> len(i)
# 包含
>>> 'mike' in i
True
列表與字符串 —— split 和 join
# 分割
item1 = []
item = "www.luffycity.com"
item1 = item.split('.')
print(item1)
# 連接
>>> i= ['hi', 'mike']
>>> '!'.join()
'hi!mike'
# range
count = 0 for i in range(101): if i % 2 == 0: count += i print(count)
二、 基本數據類型—— 元組
元組的定義和特性
特性:
- 可存放多個值
- 不可變
- 按照從左到右的順序定義元組元素,下標從0開始順序訪問,有序
元組的創建與常用操作
# 創建
ages = (11,22, 33, 44, 55)
或
ages = tuple((11,22, 33, 44, 55))
# 常用操作
# 索引
>>> ages = (11,22, 33, 44, 55)
>>> ages[0]
11
>>> ages[-1]
55
# 切片 : 同list
# 循環
>>> for age in ages:
print(age)
11
22
33
44
55
# 長度
>>> len(ages)
5
# 包含
>>> 11 in ages
True
元組的特性詳解
1. 可存放多個值
如果元組中只有一個值
t = (1,)
t = (1) # <==>t = 1
元組中不僅可以存放數字,字符串,還可以存放更加復雜的數據類型
2. 不可變
元組本身不可變,如果元組中還包含其它可變元素,這些可變元素可以改變
三 、可變 不可變數據類型和hash
可變類型 | 不可變類型 |
列表 | 數字 |
字符串 | |
元組 |
# 列表
>>> i = [1,2,3,4]
>>> id(i)
4392665160
>>> i[1] = 1.5
>>> i
[1,1.5,3,4]
>>> id(i)
4392665160
# 數字
>>> a = 1
>>> id(a)
4297537952
>>> a+=1
>>> id(a)
4297537984
從內存角度看列表與數字的變與不變
字符串
# 例1
>>> s = 'hello'
>>> s[1] = 'a'
Traceback (most recent call last):
File "<pyshell#5>". line 1, in<module>
s[1] = 'a'
TypeError:'str' object does not support item assignment
# 例2
>>> s = 'hello'
>>> id(s)
4392917064
>>> s += 'world'
>>> s
'hello world'
>>> id(s)
4393419504
字符串也可以像列表一樣使用索引操作,但是通過上例可以看出,不能像修改列表一樣修改一個字符串的值,當對字符串進行拼接的時候,原理和整數一樣,id值已經發生了變化,id值已經發生了變化,相當於變成了另外一個字符串。
元組不允許修改
>>> t = (1,2,3,4)
>>> t[1] = 1.5
Traceback (most recent call last):
File "<pyshell#5>". line 1, in<module>
t[1] = 1.5
TypeError: 'tuple' object does not support item assignment
hash
存儲如下一些數據:
張三 13912345678
李四 13812345678
王五 13612345678
>>> hash("張三")
-354361033326252388
>>> hash("李四")
-8011736106419318409
>>> hash("王五")
-5353383273595561117
四、字典
字典的定義和特性
字典是python語言中唯一的映射類型
定義: {key1:value1,key2:value2}
1、鍵與值用冒號":"分開
2、項與項用逗號“,” 分開
特性:
- key-value結構
- key必須可hash,且必須為不可變數據類型,必須唯一
- 課存放任意多個值,課修改、可以不唯一
- 無序
字典的創建與常見操作
person = {"name":"mike", age:20}
或
person = dict(name='mike', age=20}
或
person = dict((['name','mike'],['tom',22]))
{}.fromkeys(seq,100) # 不指定100默認為NOne
# 注意
>>> dic = {}.fromkeys(['k1','k2'],[])
>>> dic
{'k1': [], 'k2': []}
>>> dic['k1'].append(1)
>>> dic
{'k1': [1], 'k2': [1]}
字典的常見操作
鍵、值、鍵值對
- dic.keys() 返回一個包含字典所有key的列表
- dic.values() 返回一個包含字典所有value的列表
- dic.items() 返回一個包含所有(鍵、值)元組的列表
- dic.iteritems()、dic.iterkeys()、dic.itervalues() 與它們對應的非迭代方法一樣,不同的是他們返回一個迭代值,而不是一個列表
# 新增
- dic['new_key'] = 'new_value'
- dic.setdefault(key,None), 如果字典中不存在key鍵,由dic[key]= default 為他賦值
# 刪除
- dic.pop(key[,default]) 和get方法相似。如果字典中存在key,刪除並返回key對應的vuale;如果key不存在,且沒有給出default的值,則引發keyerror異常
- dic.clear() 刪除字典中的所有項或元素
# 修改
- dic['key'] = 'new_value',如果key在字典中存在,‘new_value'將會替代原來的value值
- dic.update(dic2) 將字典dic2的鍵值對添加到字典dic中
# 查看
- dic['key'] ,返回字典中key對應的值,若key不存在字典中,則報錯
- dic.get(key,default=None) 返回字典中key對應的值,若key不存在字典中,則返回default的值
# 循環
- for k in dic.keys()
- for k,v in dic.items()
- for k in dic
# 長度
len(dic)
五、 集合
認識集合
集合是一個數學概念,由一個或多個確定的元素所構成的整體叫集合
集合中的元素有三個特點:
- 確定性(元素必須可hash)
- 互異性(去重)
- 無序性(集合中的元素沒有先后之分),如集合{3,4,5}和{3,5,4}算作一個集合
注意: 集合存在的意義就在於去重和關系運算
集合的關系運算
&.& =:交集——即學習跆拳道課程也學習機器人的同學
i={'張三','李四','王五'} p={'張三','李四','mike'} print(i.intersection(p)) print(i & p)
|,|=:合集,也叫並集——學習跆拳道課程和學習機器人的同學
i={'張三','李四','王五'}
p={'張三','李四','mike'}
print(i.union(p))
print(i|p)
-,-=:差集——只在學習跆拳道課程而不學習機器人的同學
i={'張三','李四','王五'} p={'張三','李四','mike'} print(i.difference(p)) print(i-p)
~,~=:對稱差集——只在學習跆拳道課程或只學習機器人的同學
i={'張三','李四','王五'} p={'張三','李四','mike'} print(i.symmetric_difference(p)) print(i^p)
包含關系
in,not in:判斷某元素是否在集合內
==,!= : 判斷兩個集合是否相等
兩個集合之間一般有三種關系,相交、包含、不相交,在python中分別用下面的方法判斷
- set.isdisjonit(s): 判斷兩個集合是不是不相交
- set.issuperset(s): 判斷集合是不是包含其他集合,等同於a>=b
- set.issubset(s): 判斷集合是不是被其他集合包含,等同於a<=b
集合的常用操作:
# 元素的增加
單個元素的增加: add(),add的作用類似列表中的append
對序列的增加:update(),而update類似extend方法,update方法可以支持同時傳入多個參數
#元素的刪除
集合刪除單個元素有兩種方法:
元素不在原集合中時:
set.discard(x)不會拋出異常
set.remove(x) 會拋出keyError錯誤
pop(): 由於集合是無序的,pop返回的結果不能確定,且當集合為空時調用pop會拋出keyerror錯誤
clear(): 清空集合
六:collections
collections模塊:
- namedtuple: 生成可以使用名字來訪問元素內容的tuple子類
- deque:雙端隊列,可以快速的從另外一側追加和推出對象
- counter:計數器,主要用來計數
- orderddict:有序字典
- defaultdict:帶有默認值的字典
# namedtuple
from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(1, 2) print(p.x) print(p.y)
輸出:
1
2
namedtuple是一個函數,它用來創建一個自定義的tuple對象,並且規定了tuple元素的個數,並可以用屬性而不是索引來引用tuple的某個元素
類似的,要用坐標和半徑表示一個圓,可以用namedtuple定義
# namedtuple('名稱',[屬性list]):
Circle = namedtuple('Circle',['x','y','r'])
deque
deque 是為了高效實現插入和刪除操作的雙向列表,適合用於隊列和棧
from collections import deque q = deque(['a', 'b', 'c']) q.append('x') q.appendleft('y') print(q)
defaultdict
使用dict時,如果引起的key不存在,就會拋出KeyError。希望key不存在時,返回默認值,用defaultdict
orderedDict
使用dict時,key是無序的,在對dict做迭代時,無法確定key的順序
要保持key的順序,可以用orderedDict
orderedDict可以實現一個FIFO(先進先出)的dict,當容量超出限制時,先刪除最早添加的key
from collections import Counter c = Counter() for ch in 'programming': c[ch] = c[ch] + 1 print(c)
輸出:
Counter({'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})
Counter實際上也是dict的一個子類
知識點小結:
基本數據類型:
可變數據類型 |
不可變數據類型 |
列表(list) | 數字類(bool,int,float,complex) |
字典(dict) | 字符串(str) |
集合(set) | 元組(tuple) |
不可變集合(frozenset) |
擴展數據類型
- namedtuple: 生成可以使用名字來訪問元素內容的tuple子類
- deque:雙端隊列,可以快速的從另外一側追加和推出對象
- counter:計數器,主要用來計數
- orderddict:有序字典
- defaultdict:帶有默認值的字典