本文首發於知乎python
咱們來看下面6組數據編程
d = {'name' : ['a', 'b', 'c'],
'num' : [1, 2, 3]}
lt = [('a', 1), ('b', 2), ('c', 3)]
ld = [{'name': 'a', 'num': 1},
{'name': 'b', 'num': 2},
{'name': 'c', 'num': 3}]
ld1 = [{'a': 1}, {'b': 2}, {'c': 3}]
ls = [{'a', 1}, {'b', 2}, {'c', 3}]
d1 = {'a': 1, 'b': 2, 'c': 3}
複製代碼
考慮一下他們都表示什麼,他們之間的關係是什麼,有沒有發矇?json
下面咱們就好好理一下這些基礎的數據類型bash
1.從data.frame的角度考慮函數
從data.frame的角度考慮,前面三個的內在含義是同樣的,它們均可以直接調用pandas庫中的DataFrame
函數構造一個數據框,以下所示spa
>>> d = {'name' : ['a', 'b', 'c'],
... 'num' : [1, 2, 3]}
>>> lt = [('a', 1), ('b', 2), ('c', 3)]
>>> ld = [{'name': 'a', 'num': 1},
... {'name': 'b', 'num': 2},
... {'name': 'c', 'num': 3}]
>>>
>>> import pandas as pd
>>> pd.DataFrame(d)
name num
0 a 1
1 b 2
2 c 3
>>> pd.DataFrame(lt, columns=('name', 'num'))
name num
0 a 1
1 b 2
2 c 3
>>> pd.DataFrame(ld)
name num
0 a 1
1 b 2
2 c 3
複製代碼
d
是按照列拆分,lt
是按照行拆分,ld
也是按行拆分,只是每次都帶有索引項。code
咱們用爬蟲抓取到的數據最多見的是ld
的形式,以下圖所示索引
(改進 json)get
將ld
向其餘兩種類型轉化的代碼以下所示string
>>> ld
[{'name': 'a', 'num': 1}, {'name': 'b', 'num': 2}, {'name': 'c', 'num': 3}]
>>> [tuple(i.values()) for i in ld]
[('a', 1), ('b', 2), ('c', 3)]
>>> {'name': [d['name'] for d in ld],
... 'num': [d['num'] for d in ld]}
{'name': ['a', 'b', 'c'], 'num': [1, 2, 3]}
複製代碼
兩兩相互轉化也是能夠實現的,思路相似,這裏再也不贅述
2.字典融合
來看下面這兩個之間的關係
ld1 = [{'a': 1}, {'b': 2}, {'c': 3}]
d1 = {'a': 1, 'b': 2, 'c': 3}
複製代碼
一個字典內自己就能夠有多個鍵值對,因此說以字典爲元素的列表,是能夠融合成爲一個字典的
>>> ld1 = [{'a': 1}, {'b': 2}, {'c': 3}]
>>> result = {}
>>> for d in ld1:
... result.update(d)
...
>>> result
{'c': 3, 'a': 1, 'b': 2}
# 第二種方法
>>> {k:v for d in ld1 for k,v in d.items()}
{'c': 3, 'a': 1, 'b': 2}
複製代碼
一個字典固然也能夠拆分紅多個小字典的列表
>>> d1 = {'a': 1, 'b': 2, 'c': 3}
>>> [{k:v} for k,v in d1.items()]
[{'c': 3}, {'a': 1}, {'b': 2}]
複製代碼
3.字典的轉化
此次咱們來看這三個
d1 = {'a': 1, 'b': 2, 'c': 3}
lt = [('a', 1), ('b', 2), ('c', 3)]
ls = [{'a', 1}, {'b', 2}, {'c', 3}]
複製代碼
後兩個能夠直接用dict
轉化爲字典,可是有些差別
>>> lt = [('a', 1), ('b', 2), ('c', 3)]
>>> dict(lt)
{'c': 3, 'a': 1, 'b': 2}
>>> ls = [{'a', 1}, {'b', 2}, {'c', 3}]
>>> dict(ls)
{1: 'a', 2: 'b', 'c': 3}
複製代碼
由於ls
是以集合爲元素的列表,集合是無序,所以轉化爲字典時,誰做爲鍵誰做爲值就不必定了。
由d1
反過來也是能夠轉化爲lt ls
的
>>> d1 = {'a': 1, 'b': 2, 'c': 3}
>>> [tuple(i) for i in d1.items()]
[('c', 3), ('a', 1), ('b', 2)]
>>> [(k, v) for k, v in d1.items()] # 第二種方法
[('c', 3), ('a', 1), ('b', 2)]
>>> [{k, v} for k, v in d1.items()]
[{'c', 3}, {1, 'a'}, {2, 'b'}]
複製代碼
4.三個列表
接下來看下面三個的對比
lt = [('a', 1), ('b', 2), ('c', 3)]
ls = [{'a', 1}, {'b', 2}, {'c', 3}]
ld1 = [{'a': 1}, {'b': 2}, {'c': 3}]
複製代碼
這三個都是列表,只是列表的元素分別爲元組、集合、字典,它們之間的相互轉化關係也是很是明確的,舉幾個例子
>>> lt = [('a', 1), ('b', 2), ('c', 3)]
>>> ls = [{'a', 1}, {'b', 2}, {'c', 3}]
>>> ld1 = [{'a': 1}, {'b': 2}, {'c': 3}]
>>> [{k, v} for k, v in lt] # lt 到 ls
[{1, 'a'}, {2, 'b'}, {'c', 3}]
>>> [{k: v} for k, v in lt] # lt 到 ld1
[{'a': 1}, {'b': 2}, {'c': 3}]
>>> [(k, v) for d in ld1 for k, v in d.items()] # ld1 到 lt
[('a', 1), ('b', 2), ('c', 3)]
>>> [(k, v) for k, v in ls]
[(1, 'a'), (2, 'b'), ('c', 3)]
>>> [{k: v} for k, v in ls]
[{1: 'a'}, {2: 'b'}, {'c': 3}]
複製代碼
能夠看到ls
沒法很好地轉化爲其餘兩個,由於集合內部元素是無序的。
就對比到這裏了,若是有小夥伴想到更有趣的嵌套方式,歡迎在評論區留言!
專欄主頁:python編程
專欄目錄:目錄
版本說明:軟件及包版本說明