Python3下字典奠滑、字符串及列表的相互轉(zhuǎn)換

今天我們學習Python中幾種常見數(shù)據(jù)結(jié)構(gòu)的相互轉(zhuǎn)換:字符串(str)萄凤、字典(dict)室抽、列表(list)

字符串--列表

  • 字符串轉(zhuǎn)列表
  1. 使用內(nèi)置函數(shù) list()
>>> str1 = "abcdefg"
>>> list1 = list(str1)
>>> print(list1)
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>>
  1. 使用內(nèi)置函數(shù) eval()
>>> str2 = "['aaa', 'bbb', 'ccc', 'ddd']"
>>> list2 = eval(str2)
>>> print(type(list2))
<class 'list'>
>>> print(list2)
['aaa', 'bbb', 'ccc', 'ddd']
>>>
  1. 使用內(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']
>>>
  1. 使用 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)字符串
  1. 使用內(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']
>>>
  1. 使用 join() 進行拼接
>>> list3 = ['username=admin', 'passsword=123456']
>>> str3 = "&".join(list3)
>>> print(type(str3))
<class 'str'>
>>> print(str3)
username=admin&passsword=123456
>>>
  1. 使用內(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)字典
  1. 使用內(nèi)置函數(shù) eval()
>>> str1 = "{'username':'admin', 'password':123456}"
>>> dict1 = eval(str1)
>>> print(type(dict1))
<class 'dict'>
>>> print(dict1)
{'username': 'admin', 'password': 123456}
>>>
  1. 使用內(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}
>>>
  1. 使用內(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)字符串
  1. 使用內(nèi)置函數(shù) str()
>>> dict1 = {'username': 'admin', 'password': 123456}
>>> str1 = str(dict1)
>>> print(type(str1))
<class 'str'>
>>> print(str1)
{'username': 'admin', 'password': 123456}
>>>
  1. 使用內(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)列表
  1. 使用內(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)字典
  1. 使用內(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}
>>>
  1. 使用內(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'}
>>>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劳淆,隨后出現(xiàn)的幾起案子眶拉,更是在濱河造成了極大的恐慌,老刑警劉巖憔儿,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異放可,居然都是意外死亡谒臼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門耀里,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈缤,“玉大人,你說我怎么就攤上這事冯挎〉赘纾” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵房官,是天一觀的道長趾徽。 經(jīng)常有香客問我,道長翰守,這世上最難降的妖魔是什么孵奶? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蜡峰,結(jié)果婚禮上了袁,老公的妹妹穿的比我還像新娘朗恳。我一直安慰自己,他們只是感情好载绿,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布粥诫。 她就那樣靜靜地躺著,像睡著了一般崭庸。 火紅的嫁衣襯著肌膚如雪怀浆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天冀自,我揣著相機與錄音揉稚,去河邊找鬼。 笑死熬粗,一個胖子當著我的面吹牛搀玖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驻呐,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灌诅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了含末?” 一聲冷哼從身側(cè)響起猜拾,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佣盒,沒想到半個月后挎袜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡肥惭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年盯仪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜葱。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡全景,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牵囤,到底是詐尸還是另有隱情爸黄,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布揭鳞,位于F島的核電站炕贵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏野崇。R本人自食惡果不足惜鲁驶,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舞骆。 院中可真熱鬧钥弯,春花似錦径荔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睛蛛,卻和暖如春鹦马,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忆肾。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工荸频, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人客冈。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓旭从,卻偏偏與公主長得像,于是被迫代替她去往敵國和親场仲。 傳聞我的和親對象是個殘疾皇子和悦,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354