Python中字典的詳細用法


#字典
#字典是Python中唯一內建的映射類型。字典中沒有特殊的順序,但都是存儲在一個特定的鍵(key)下面,鍵可以是數字,字符串,甚至是元組

#一、字典的使用
#在某些情況下,字典比列表更加適用:
#1、表示一個游戲棋盤的狀態,每個鍵都是由坐標值組成的元組
#2、存儲文件修改時間,用文件名作為鍵;
#3、數字電話\地址薄

#1、使用列表創建一個電話本,(這里用字符串表示電話號碼,以0開頭的數字回會被編譯成8進制數字)
name=["A","B","C","D"]
phone=["2341","9102","3158","0142","5551"]
print(phone[name.index("B")])
#這樣做可以,但是不實用

#二、創建和使用字典
#創建一個字典,字典由多個鍵與其對應的值構建成的鍵-值對組成,中間由冒號隔開,項之間用逗號隔開,字典由大括號括起來。空字典由{}組成
#字典中的鍵是唯一的,而值不唯一
phonebook={"Alice":"2431",'Beth':'9102','Cecil':'3258'}

#1、dict函數,可以使用dict函數,通過其他映射(比如其他字典)或者(鍵,值)對的序列建立字典
items=[('name','Gumby'),('age',42)]
d=dict(items)
print(d)
print(d['name'])

#dict函數也可以通過關鍵字參數來創建字典
a=dict(name="CY",num=42)
print(a['name'])

#2、基本字典的操作
#大部分操作與序列相似

#返回字典中鍵值對的數量
print(len(a))

 

#普通索引
a=dict(name="CY",num=42)
print(a["name"])

#給字典中的key賦值
a["name"]="Challenger"
print(a)

#del 刪除key
del a["name"]
print(a)

#使用in來檢測字典中key是否存在
print("num" in  a)

#與列表的不同之處
# 鍵類型:字典的鍵類型不一定為整形數據,鍵可以是任意不可變類型,比如浮點類型(實型)、字符串或者元租
# 自動添加:即使鍵起初在字典中並不存在,也可以為它賦值,字典就會建立新的項。而(在不使用append方法或者其他類似操作的情況下)不能將值關聯到列表范圍之外的索引上
# 表達式 key in dictionary,查找的是鍵,而不是值。表達式 value in list,用來查找值,而不是索引。
#在字典中檢查鍵的成員資格比在列表中檢查值的成員資格更高,數據結構規模越大,倆者的效率差距越明顯

 

#字典示例
#一個簡單的數據庫
#字典使用人名作為鍵值。每個人用另一個字典來表示,其鍵'phone'和'addr'分別表示他們的電話號碼和地址
people={
    'Alice':{
        'phone':'2341',
        'addr':'Fpp driver 23'
    },

    'Beth':{
        'phone':'9102',
        'addr':'Bar street 42'
    },

    'Cecil':{
        'phone':"3158",
        'addr':'Baz avenue 90'
    }
}

#針對電話號碼的地址使用的描述性標簽,會在打印輸出的時候用到
lable={
    'phone':'phone number',
    'addr':'address'
}

name=input('Name: ')
#查找電話號碼還是地址?
request=input('Phone number(p) or address(a)?')
#使用正確的鍵值
if request=='p':
    key='phone'
if request=='a':
    key='addr'
#如果名字是字典中的有效鍵值才打印信息
if name in people:
    print("%s's %s is %s."%(name,lable[key],people[name][key]))

 

#4字典方法
#1、clear方法
#clear方法清除字典中所有的項,這個是原地操作,類似(list.sort)所以無返回值(或者是返回None)
d={}
d['name']='CY'
d['age']=23
print(d)
returned_value=d.clear()
print(d)
print(returned_value)
#使用clear的意義是真正清空原來的字典
#情況一,將x關聯到一個空字典可以清空x,但是不會影響到y,y還關聯原來的字典。
x={}
y=x
x['key']='value'
print(y)
x={}
print(x)
print(y)
#情況二,使用clear方法可以清空原來的字典
x1={}
y1=x1
x1["key"]="value"
print(y1)
x1.clear()
print(x1)
print(y1)

 

#2、copy方法返回一個具有相同鍵值對的新字典(這個方法實現的是淺復制,因為值本身是相同的,而不是副本),使用copy復制過來的字典,如果替換值時不受影響,如果修改(增,刪)值,原始字典也會改變

x={'username':'admin','machines':['foo','bar','baz']}
y=x.copy()
y['username']='mlh'
y['machines'].remove('bar')
print(y)
print(x)

#避免上述問題,可以使用深復制 deepcopy函數
from copy import deepcopy
d={}
d['name']=['Alfred','Bertrand']
c=d.copy()
dc=deepcopy(d)
d['name'].append('Clive')
print(c)
print(dc)

#3、fromkeys方法使用給定的鍵建立新的字典,每個鍵都對應一個None
print({}.fromkeys(['name','age']))
#以上方法使用空字典,建立另一個字典有些多余,可以直接使用dict方法
print(dict.fromkeys(['name','age']))
#也可以指定默認值
print(dict.fromkeys(['name','age'],'(unknown)'))

#4、get方法是很寬松的訪問字典的方法,不使用get,訪問字典中不存在的項會出錯,會返回none
d={}
print(d.get('name'))
#還可以自定義"默認值"
print(d.get('name',"N/A"))
#如果鍵存在,get使用方法和普通字典查詢一樣
d['name']='CY'
print(d.get('name'))

 

#使用get方法實現電話本的功能
people={
    'Alice':{
        'phone':'2341',
        'addr':'Fpp driver 23'
    },

    'Beth':{
        'phone':'9102',
        'addr':'Bar street 42'
    },

    'Cecil':{
        'phone':"3158",
        'addr':'Baz avenue 90'
    }
}

lable={
    'phone':'phone number',
    'addr':'address'
}

name=input('Name: ')

request=input('Phone number(p) or address(a)?')

if request=='p':
    key='phone'
if request=='a':
    key='addr'

person=people.get(name,{})
lable=lable.get(key,key)
result=person.get(key,'not available')
print("%s's %s is %s."%(name,lable,result))

 

#5、items
#item方法將字典所有的項以列表方式返回,返回時沒有特定的次序
# 3.x 里面,iteritems()和viewitems()這兩個方法都已經廢除了,而items()得到的結果是和2.x里面viewitems()一致的。在3.x里用items()替換iteritems(),可以用於for來循環遍歷。
d={'title':'ppp','name':'ccc'}
print(d.items())

#6、keys()將字典中的鍵以列表形式返回
print(d.keys())

#7、pop方法用來獲得對應於給定鍵的值,然后將這個鍵值對從字典中移除
d1={'aasd':"sadad",'asdasd':"sadsadad"}
print(d1.pop('aasd'))
print(d1)

#8、popitem
#popitem方法類似於list.pop,后者彈出列表最后一個元素。但不同的是,popitem彈出隨機的項,因為字典中沒有最后的元素,該方法適合一個接一個旳移除並且處理項(不用首先獲取鍵的列表,所以很高效)
d2={'a':'b',"c":'d'}
print(d2.popitem())
print(d2)

#9、setdefault
#setdefault在某種程度上類似於get,可以獲得與給定鍵相關的值,setdefault還能在字典中不含給定鍵的情況下設定相應的鍵值,如果鍵值存在,不會修改原來的鍵值
d3={}
d3.setdefault('name','None')
print(d3)
d3['name']='CY'
print(d3.setdefault('name','None'))

#10、update
#update方法可以利用一個字典更新另一個字典,如果鍵值存在則直接覆蓋,如果不存在則會添加
d={'title':'sasdadadad',"url":"asdasdadsad","change":'asdasdada'}
a={'title':"a"}
d.update(a)
print(d)

#11、values,用於返回當前字典中的值
d={}
d[1]=1
d[2]=2
print(d.values())

 

#字典的格式化字符串
#在每個轉換說明符的后面,可以加上鍵(用括號括起來),后面再加上說明元素
phonebook={'Beth':'9102','Alice':'1111','tom':'1551'}
print("tom's phoneNum is %s" % phonebook["tom"])
print("tom's phoneNum is %(tom)s" % phonebook)

#除了增加的字符串鍵外,轉換說明符還是像以前一樣工作。,當以這種方式使用字典的時候,只要所有給出的鍵都能在字典中找到,就可以使用任意數量的轉換說明符。
#這類字符串格式化在模板系統中非常有用
template="""<html>
<head><title>%(title)s</title></head>
<body>
<h1>%(title)s</h1>
<p>%(text)s</p>
</body>
"""

data={"title":"My Home Page","text":"Welcome to my home page!"}
print(template % data)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM