玩轉python字典與列表(上)

本文首發於知乎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編程

專欄目錄:目錄

版本說明:軟件及包版本說明

相關文章
相關標籤/搜索