詳解元組、列表、字典、集合<二>

三、字典(dict)


1.字典的創建

  • 賦值創建字典
In [2]: d = {1,True,"hello"}

In [3]: type(d)
Out[3]: set

#字典由keyvalue構成,一個key對應一個valuekey-value , 鍵值對
In [4]: d = {1:"freya",2:"lili",3:"lucy"} 

In [5]: type(d)
Out[5]: dict

In [6]: print d
{1: 'freya', 2: 'lili', 3: 'lucy'}
  • 通過工廠函數創建字典
#通過字典的dict()方法創建
In [17]: d = dict(user= "freya",)

In [18]: userinfo = dict(user1="123", user2="456", user3 ="789")

In [19]: print userinfo
{'user2': '456', 'user3': '789', 'user1': '123'}

# 通過字典的 fromkeys 方法創建字典,所有元素有一個默認值
# 如果沒有指定默認值,默認爲 None;
print {}.fromkeys("hello")
{'h': None, 'e': None, 'l': None, 'o': None}
# 給每個元素設置默認值爲 "123";
print {}.fromkeys(["user1", "user2", "user3"], "123")
{'user2': '123', 'user3': '123', 'user1': '123'}

應用案例: 生成多個銀行卡號,並初始化密碼爲”000000”

# 卡號由 6 位組成, 前 3 位是 610 , 後面的依次是 001, 002, 003...100
cardids = []
for i in range(1, 10):   # i = 1, 2, 3, 4...100
    a = "610%.3d" %(i)    # a= 610001, 610002, 610003, ....610100
    cardids.append(a)
print {}.fromkeys(cardids, "000000")

2.分析字典的特性(跟元組和列表比較)

  • 字典不能索引和切片,因爲字典是無序的數據類型
  • 字典不支持重複和連接
  • 字典支持成員操作符: 判斷字典的key值是否在字典中存在
In [25]: userinfo = dict(user1="123", user2="456", user3 ="789")

In [26]: "user1" in userinfo
Out[26]: True

In [27]: "123" in userinfo  #由於是判斷字典的key值是否在字典中,而該語句判斷的是value,故返回false
Out[27]: False

3.字典的增刪改查

(1)增


  • 字典名[key] = value
###value的數據類型爲字符串
In [30]: d = {1:"freya",2:"lili"}

In [31]: d[3] = "lucy"

In [32]: print d
{1: 'freya', 2: 'lili', 3: 'lucy'}

###字典內的value的數據類型也爲字典的情況
In [36]: d = {"freya":{1:"freya"},"lili":{2:"lili"}}

In [37]: d["lucy"] = {3:"lucy"}

In [38]: print d
{'lili': {2: 'lili'}, 'lucy': {3: 'lucy'}, 'freya': {1: 'freya'}}
  • update()方法
    update 方法實現添加: key 存在,覆蓋 value 值, 否則,就是添加
    語法格式:
    字典名.update(key=value)
    字典名.update({key:value})
In [46]: print d
{'lili': {2: 'lili'}, 'freya': {1: 'freya'}}

#使用update的方法可以添加多個鍵值對,注意:鍵不打引號
In [47]: d.update(tom={4:"tom"},peter={5:"peter"})

In [48]: print d
{'peter': {5: 'peter'}, 'lili': {2: 'lili'}, 'freya': {1: 'freya'}, 'tom': {4: 'tom'}}
  • setdefault() 實現添加: key 存在,不覆蓋 value 值, 否則,添加

    語法格式:字典名.setdefault(key,value)

#key存在,不覆蓋value
In [52]: print d                  #剛開始的d的key-value
{'peter': {5: 'peter'}, 'lili': {2: 'lili'}, 'freya': {1: 'freya'}, 'tom': {4: 'tom'}}

In [53]: d.setdefault("peter",{7:"peterr"})
Out[53]: {5: 'peter'}

In [54]: print d                  #無變化
{'peter': {5: 'peter'}, 'lili': {2: 'lili'}, 'freya': {1: 'freya'}, 'tom': {4: 'tom'}}

#key不存在,覆蓋value

{'peter': {5: 'peter'}, 'lili': {2: 'lili'}, 'freya': {1: 'freya'}, 'tom': {4: 'tom'}}                         #剛開始的d的key-value

In [56]: d.setdefault("happy",{7:"happy"})
Out[56]: {7: 'happy'}

In [57]: print d                  #添加成功
{'happy': {7: 'happy'}, 'peter': {5: 'peter'}, 'lili': {2: 'lili'}, 'freya': {1: 'freya'}, 'tom': {4: 'tom'}}

(2)刪
以字典名d爲例
- d.pop(key) 刪除指定 key 的字典元素
- d.popitem()隨機刪除字典的 key-value 元素
- del d[key]刪除指定 key 的字典元素;
- d.clear()清空字典元素
(3)查
- 查看key值

In [60]: services = {'ftp': 22, 'http': [80, 8080]}

In [61]: services.keys()
Out[61]: ['ftp', 'http']
  • 查看value值
In [62]: services = {'ftp': 22, 'http': [80, 8080]}

In [63]: services.values()
Out[63]: [22, [80, 8080]]
  • 查看key-value鍵值對
In [65]: services = {'ftp': 22, 'http': [80, 8080]}

In [66]: services.items()
Out[66]: [('ftp', 22), ('http', [80, 8080])]
  • 查看key是否存在
# 查看 key是否存在 
In [67]: services = {'ftp': 22, 'http': [80, 8080]}

In [68]: services.has_key('ftpp')
Out[68]: False

#查看指定 key 對應的 value 值
In [71]: services = {'ftp': 22, 'http': [80, 8080]}

In [72]: services["ftp"]  #當key存在,返回 value 值
Out[72]: 22

In [73]: services["tp"]   #當key不存在,直接報錯
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-73-51d7e8789a37> in <module>()
----> 1 services["tp"]

KeyError: 'tp'

##解決該問題可以使用
services.get(key)    如果 key 不存在,不報錯; 如果存在,返回 value

(4)改(類似與增)

  • 字典名[key]=value
  • 字典名.update({key:value})
  • 字典名.update(key=value)

4.字典元素循環遍歷字典

#遍歷字典的key-value
services = {'ftp': 22, 'http': [80, 8080]}
for i,j in services.items():
    print i,j

#運行效果:
ftp 22
http [80, 8080]

#默認情況下遍歷字典的 key 值
services = {'ftp': 22, 'http': [80, 8080]}
for i in services:
    print i

#運行效果:
ftp
http

5.字典應用

(1).由於目前python不支持case語句,實現case語句的兩種方式,以實現四則運算爲例

  • if…elif…elif…else…
print  """
  實現四則運算
  用戶分別輸入第一個數字,運算操作符,第三個數字;
  根據用戶的運算操作打印出運算結果;
"""

num1 = input("num1:")
ope = raw_input("operator:")
num2 = input("num2:")
# case 語句
if ope == "+":
    print num1+num2
elif ope == "-":
    print num1-num2
elif ope == "*":
    print num1*num2
elif ope == "/":
    print num1/num2
else:
    print "error operator"
  • 字典實現
print  """
  實現四則運算
  用戶分別輸入第一個數字,運算操作符,第三個數字;
  根據用戶的運算操作打印出運算結果;
"""

num1 = input("num1:")
ope = raw_input("operator:")
num2 = input("num2:")
# case 語句
d = {
"+" :num1+num2,
"-" :num1-num2,
"*" :num1*num2,
"/" :num1/num2,
}

if not ope in d:
    print "error operator"
else:
    print d[ope]

(2)用戶登錄管理系統
詳見我的用戶管理系統這篇博客

四、集合(set)


1.集合的兩個功能:
集合可以實現去重的功能;
集合可以實現關係測試; 交集, 差集,並集, 是否子集, 是否沒有交集……..
2.集合的創建

  • 集合是不重複的數據結構
# 如果花括號裏面爲空,則是字典類型
s = {}
print type(s)
<type 'dict'>

s = {1, 2, 3, 2, 3}
print type(s)
print s

運行效果:
<type 'set'>
set([1, 2, 3])
  • 工廠方法定義集合時, 括號裏面是可迭代的對象, eg: 數值類型不可以
#定義一個空的集合
s = set()

#集合內的成員可以是字符串、字典、元組、列表這些可迭代對象

s1 = set("hello")
print s1

s2 = set({'a':1, 'b':2, 'c':3})
print s2

s3 = set((1,2,3,4,5))
print s3

s4 = set([1,2,3,1,2,3])
print s4

運行結果:

set(['h', 'e', 'l', 'o'])
set(['a', 'c', 'b'])
set([1, 2, 3, 4, 5])
set([1, 2, 3])

我麼發現這些輸出都沒有重複的地方,這便體現了集合的第一個功能:去重

tips: 實現列表去重?轉換爲集合數據類型
  • set(列表)
li = [1, 2, 3, 4, 1, 2]
s = set(li)
li = list(s)
print li

運行效果:
[1, 2, 3, 4]
  • 字典的fromkeys方法實現
li = [1, 2, 3, 4, 1, 2]
d = {}.fromkeys(li)
print d.keys()

運行效果:
[1, 2, 3, 4]

3.集合的特性

  • 集合是無序的, 不重複的數據類型
  • 因此不支持索引,也不支持切片;也不支持重複;也不支持連接
  • 支持成員操作符
  • 支持for循環,是可迭代的對象

4.集合的增刪差改

###使用add()方法
s = {1, 2, 3, 4, 1, 2}
print s
s.add(1)    #當添加的是重複的元素,添加失敗
s.add(7)    #當添加的不是重複的元素,添加成功
print s
運行效果:
set([1, 2, 3, 4])  
set([1, 2, 3, 4, 7])

###使用update()方法
s1 = {'a', 'b', 'c'}
s.update(s1)
print s
運行效果:
set(['a', 1, 2, 3, 4, 7, 'c', 'b'])
1pop方法的含義是刪除隨機一個元素,若集合爲空,則產生錯誤。
s = {1, 2, 3, 4, 1, 2}
s.pop()
print s

運行結果:
set([2, 3, 4])

(2)remove方法刪除集合指定元素, 如果不存在,則報錯。
s = {1, 2, 3, 4, 1, 2}
s.remove(2)
print s

運行結果:
set([1, 3, 4])

(3)discard方法刪除集合指定元素, 如果不存在,do nothing;
s = {1, 2, 3, 4, 1, 2}
s.discard(7)
print s

運行結果:
set([1, 2, 3, 4])

(4)clear方法是清空集合元素
s = {1, 2, 3, 4, 1, 2}
s.clear()
print s

運行效果:
set([])
  • 查- (關係測試操作)
s1 = {1, 2, 3, 4}
s2 = {1, 2, 3, 5}
# 交集
print s1 & s2   or  s1.intersection(s2)
# 並集
print s1 | s2   or  s1.union(s2)
# 差集
print s1 - s2   or  s1.difference(s2)  #s1中有,s2中沒有的元素
print s2 - s1   or  s2.difference(s1)  #s2中有,s1中沒有的元素
# 對等差分,s1和s2的並集減去公共的部分後的元素   
print s1 ^ s2   or  s1.symmetric_difference(s2)

運行結果:
set([1, 2, 3])
set([1, 2, 3, 4, 5])
set([4])
set([5])
set([4, 5])

#判斷兩個集合的關係
s1.issubset(s2)      #判斷s1是否爲s2的子集
s1.issuperset(s2)    #判斷s1是否爲s2的父集
s1.isdisjoint(s2)    #判斷s1和s2是否沒有交集

  • 類比增(不贅述)

應用

(華爲機試題)題目描述
明明想在學校中請一些同學一起做一項問卷調查,爲了實驗的客觀性, 他先用計算機生成了N11000之間的隨機整數(N1000), N是用戶輸入的,對於 其中重複的數字,只保留一個,把其餘相同的數去掉,不同的數對應 着不同的學生的學號。然後再把這些數從小到大排序,按照排好的順 序去找同學做調查。請你協助明明完成“去重”與“排序”的工作

代碼如下:

s = set()
N = input('輸入一個數:')
for i in range (N) :
    s.add(random.randint(1,1000))
# sorted 是內置方法, 用來排序;
print sorted(s)

運行效果:

輸入一個數:9
[408, 422, 476, 525, 586, 651, 722, 735, 959]

五、小結

我們在介紹裏數值類型的數據,以及字符串、元組、列表、字典、集合後來對他們的特性做以下總結

  • 可變數據類型: 列表, 字典, 集合
  • 不可變數據類型: 數值類型, 字符串, 元組
    可變數據類型實現某個功能, 直接改變可變的數據類型
    不可變數據類型實現某個功能,需要將結果賦值給另外一個變量

  • 是否實現for循環(是否爲可迭代數據類型)

    可迭代數據類型: str, list, tuple, dict, set
    不可迭代數據類型:數值類型

  • 是否支持索引,切片, 重複和連接特性

    有序的數據類型: str, list, tuple
    無序的數據類型: dict, set

ok~這篇博客到此結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章