Python建立字典與fromkeys的坑

小小程序员ol發表於2024-08-28

字典很重要

字典dict 是Python中很重要的一個資料型別, 透過鍵值對映, 能夠很好的定位查詢.

Django, Flask這些Web框架在做前後端分離時, 就是用字典傳資料的, 因為它和列表list 配合起來, 能夠很好的與json格式的資料相互轉化. 用Flask + Echarts做資料視覺化大屏, 傳的變數都是字典和列表.

簡單建立字典

這是最簡單的建立字典的方式:

dic = {'key1': 'value1', 'key2': 'value2'}
dic = dict(key1='value1', key2='value2')

快速建立字典

但當資料特別多的時候, 一個個手敲鍵值構造字典, 這樣非常麻煩.

Python提供了許多快速建立字典的方式,

>>> d = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d
{'one': 1, 'two': 2, 'three': 3}
 
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> d

{'two': 2, 'one': 1, 'three': 3}

fromkeys

除此之外還有一個超級nb的方法, fromkeys. 為什麼說他nb呢?

>>> import numpy as np
 
>>> data = dict.fromkeys(np.arange(10))
>>> data
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}
>>> data = dict.fromkeys(np.arange(10), '都是一樣的')
>>> data
{0: '都是一樣的', 1: '都是一樣的', 2: '都是一樣的', 3: '都是一樣的', 4: '都是一樣的', 5: '都是一樣的', 6: '都是一樣的', 7: '都是一樣的', 8: '都是一樣的', 9: '都是一樣的'}

比如我執行一個sql語句, 返回一個巨大的元組或列表, 而我又暫時不確定它的值是什麼, 就可以這樣批次建立, 值先為None, 或者隨便賦一個值

我對它真是有愛又恨, 它的一個弊端: 值必須是一個不可變物件

  • 可變物件: int, str, float, tuple

  • 不可變物件: list, dict

這意味著不可以設它的值為list 或dict, 這可糟了呀, 往Echarts傳值大多都是dict+list, 還有pandas中的DataFrame等都是dict+list的格式, 像這種:

from pandas import DataFrame
 
data = {
    'Singer': ['the rolling stones', 'Beatles', 'Guns N Roses', 'Metalica'],
    'Song_name': ['Satisfaction', 'Let it Be', 'Don’t Cry', 'Nothing Else Matters'],
    'Year': [2000, 2001, 2000, 2002]
}

music_data2 = DataFrame(data)

看一看如果偏要設值為list對發生什麼:

>>> import numpy as np
 
>>> data = dict.fromkeys(np.arange(10), [])
>>> data[1].append('a')
>>> data

{0: ['a'], 1: ['a'], 2: ['a'], 3: ['a'], 4: ['a'], 5: ['a'], 6: ['a'], 7: ['a'], 8: ['a'], 9: ['a']}

wc***, fromkeys你不講碼德, 我只是修改了鍵為1的值, 怎麼全都修改了!!!

那就這樣完了嗎?

可以先把設為一個不可變型別, 比如字串str, 最後再將它轉化成想要的列表就成功啦

>>> import numpy as np
#學習中遇到問題沒人解答?小編建立了一個Python學習交流群:857662006
 
>>> data = dict.fromkeys(np.arange(10), '')
>>> data[1] += 'a,'
>>> data[1] += 'b,'
>>> data = {key: value.split(',')[:-1] for key, value in data.items()}
>>> data
{0: [], 1: ['a', 'b'], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}

相關文章