今天我們學習Python中幾種常見數(shù)據(jù)結(jié)構(gòu)的相互轉(zhuǎn)換:字符串(str)
萄凤、字典(dict)
室抽、列表(list)
。
字符串--列表
- 字符串轉(zhuǎn)列表
- 使用內(nèi)置函數(shù)
list()
>>> str1 = "abcdefg"
>>> list1 = list(str1)
>>> print(list1)
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>>
- 使用內(nèi)置函數(shù)
eval()
>>> str2 = "['aaa', 'bbb', 'ccc', 'ddd']"
>>> list2 = eval(str2)
>>> print(type(list2))
<class 'list'>
>>> print(list2)
['aaa', 'bbb', 'ccc', 'ddd']
>>>
- 使用內(nèi)置模塊
json.loads()
方法
# str3 = "['aaa', 'bbb', 'ccc', 'ddd']"
# 因為 json.loads() 是將json格式字符串轉(zhuǎn)換為python對象靡努,而按 json 的標準規(guī)范應(yīng)該使用雙引號坪圾,如果使用單引號會導致報錯
>>> str3 = '["aaa", "bbb", "ccc", "ddd"]'
>>> import json
>>> list3 = json.loads(str3)
>>> print(type(list3))
<class 'list'>
>>> print(list3)
['aaa', 'bbb', 'ccc', 'ddd']
>>>
- 使用
split()
進行分割
>>> str4 = "username=admin&passsword=123456"
>>> list4 = str4.split("&")
>>> print(type(list4))
<class 'list'>
>>> print(list4)
['username=admin', 'passsword=123456']
>>>
如果我們要對多個字符進行分割,那么可以使用內(nèi)置模塊 re.split()
方法惑朦。
>>> str5 = "username=admin&passsword=123456"
>>> import re
>>> list5 = re.split("&|=", str5)
>>> print(type(list5))
<class 'list'>
>>> print(list5)
['username', 'admin', 'passsword', '123456']
>>>
- 列表轉(zhuǎn)字符串
- 使用內(nèi)置函數(shù)
str()
# 注意兽泄,轉(zhuǎn)換之后,雙引號會變?yōu)閱我?>>> list1 = ["aaa", 123, 'ccc', True]
>>> str1 = str(list1)
>>> print(type(str1))
<class 'str'>
>>> print(str1)
['aaa', 123, 'ccc', True]
>>>
上面直接使用 str()
漾月,是將整個列表轉(zhuǎn)換為字符串病梢,如果我們不想改變列表的類型,只是要將列表中所有元素轉(zhuǎn)為字符串梁肿,那么可以借助列表推導式來實現(xiàn)蜓陌。
# 注意,轉(zhuǎn)換之后吩蔑,雙引號會變?yōu)閱我?>>> list1 = ["aaa", 123, 'ccc', True]
>>> str2 = [str(i) for i in list2]
>>> print(type(str2))
<class 'list'>
>>> print(str2)
['aaa', '123', 'ccc', 'True']
>>>
- 使用
join()
進行拼接
>>> list3 = ['username=admin', 'passsword=123456']
>>> str3 = "&".join(list3)
>>> print(type(str3))
<class 'str'>
>>> print(str3)
username=admin&passsword=123456
>>>
- 使用內(nèi)置模塊
json.dumps()
方法
# 這里列表中使用了單引號
>>> list4 = ['username=admin', 'passsword=123456']
>>> import json
>>> str4 = json.dumps(list4)
>>> print(type(str4))
<class 'str'>
>>> print(str4)
["username=admin", "passsword=123456"]
>>>
需要注意的是钮热,按 json
的標準規(guī)范是使用雙引號 ""
,因此在轉(zhuǎn)換之后得到的json字符串是雙引號的烛芬。
字符串--字典
- 字符串轉(zhuǎn)字典
- 使用內(nèi)置函數(shù)
eval()
>>> str1 = "{'username':'admin', 'password':123456}"
>>> dict1 = eval(str1)
>>> print(type(dict1))
<class 'dict'>
>>> print(dict1)
{'username': 'admin', 'password': 123456}
>>>
- 使用內(nèi)置模塊
json.loads()
方法
# str1 = "{'username':'admin', 'password':123456}"
# 因為 json.loads() 是將json格式字符串轉(zhuǎn)換為python對象霉旗,而按 json 的標準規(guī)范應(yīng)該使用雙引號,如果使用單引號會導致報錯
>>> str2 = '{"username":"admin", "password":123456}'
>>> import json
>>> dict2 = json.loads(str2)
>>> print(type(dict2))
<class 'dict'>
>>> print(dict2)
{'username': 'admin', 'password': 123456}
>>>
- 使用內(nèi)置模塊
ast.literal_eval()
方法
>>> str3 = "{'username':'admin', 'password':123456}"
>>> import ast
>>> dict3 = ast.literal_eval(str3)
>>> print(type(dict3))
<class 'dict'>
>>> print(dict3)
{'username': 'admin', 'password': 123456}
>>>
我們發(fā)現(xiàn)蛀骇,Python中已經(jīng)有了內(nèi)置函數(shù) eval()
厌秒,但現(xiàn)在卻又出現(xiàn)個類似的 ast.literal_eval()
方法,二者的區(qū)別是什么呢擅憔?
這里主要是出于安全性的考慮鸵闪,因為
ast.literal_eval()
會判斷計算后的結(jié)果是不是合法的python類型,如果是則進行運算暑诸,否則就不進行運算蚌讼,而eval()
則不會管這些辟灰,即使字符串是一個命令,它也會進行解析篡石。
因此芥喇,相比 eval()
函數(shù), ast.literal_eval()
更加安全凰萨,更被 推薦使用 继控。
- 字典轉(zhuǎn)字符串
- 使用內(nèi)置函數(shù)
str()
>>> dict1 = {'username': 'admin', 'password': 123456}
>>> str1 = str(dict1)
>>> print(type(str1))
<class 'str'>
>>> print(str1)
{'username': 'admin', 'password': 123456}
>>>
- 使用內(nèi)置模塊
json.dumps()
方法
>>> dict2 = {'username': 'admin', 'password': 123456}
>>> import json
>>> str2 = json.dumps(dict2)
>>> print(type(str2))
<class 'str'>
>>> print(str2)
{"username": "admin", "password": 123456}
>>>
需要注意的是,按 json
的標準規(guī)范是使用雙引號 ""
胖眷,因此在轉(zhuǎn)換之后得到的json字符串是雙引號的武通。
如果我們想讓得到的字符串仍保持單引號,可以通過 replace()
方法來簡單處理一下珊搀。
>>> dict3 = {'username': 'admin', 'password': 123456}
>>> import json
>>> str3 = json.dumps(dict3).replace("\"", "'")
>>> print(type(str3))
<class 'str'>
>>> print(str3)
{'username': 'admin', 'password': 123456}
>>>
字典--列表
- 字典轉(zhuǎn)列表
- 使用內(nèi)置函數(shù)
list()
>>> dict1 = {"a": 1, "b": "2", "c": True}
>>> list1 = list(dict1.keys())
>>> print(list1)
['a', 'b', 'c']
>>> list2 = list(dict1.values())
>>> print(list2)
[1, '2', True]
>>>
- 列表轉(zhuǎn)字典
- 使用內(nèi)置函數(shù)
dict()
冶忱,將嵌套列表轉(zhuǎn)換為字典
>>> list3 = [['a', 1], ['b', '2'], ['c', True]]
>>> dict2 = dict(list3)
>>> print(type(dict2))
<class 'dict'>
>>> print(dict2)
{'a': 1, 'b': '2', 'c': True}
>>>
- 使用內(nèi)置函數(shù)
zip()
,將2個列表轉(zhuǎn)換為字典
>>> list1 = ["a", 'b', "c", 'd', "f"]
>>> list2 = ["1", '2', "3", '4', "5"]
>>> dict1 = dict(zip(list1,list2))
>>> print(type(dict1))
<class 'dict'>
>>> print(dict1)
{'a': '1', 'b': '2', 'c': '3', 'd': '4', 'f': '5'}
>>>
如果2個列表的長度不一樣時境析,那么就不展示多出來的元素囚枪。
>>> list1 = ["a", 'b', "c"]
>>> list2 = ["1", '2', "3", '4', "5"]
>>> dict1 = dict(zip(list1,list2))
>>> print(type(dict1))
<class 'dict'>
>>> print(dict1)
{'a': '1', 'b': '2', 'c': '3'}
>>>