Python可变数据类型高效编程
用 Python 做數據分析,主要的技術棧是 Python 基礎和三駕馬車 NumPy、Pandas 和 Matplotlib。先搞定 Python 基礎吧。
Python3 有六個標準數據類型
- 不可變類型:Number(數字)、String(字符串)、Tuple(元組) 
- 可變類型:List(列表)、Dictionary(字典)、Set(集合) 
相比不可變類型數據處理起來較明確,可變類型的騷操作就多很多。
你可以快速了解 Python 語法,基于這些語法知識,你可能能夠嘗試出你想得到的數據,但了解一些高階技巧是很有必要的。
高階技巧不僅能加快你 code 的速度,還能讓代碼更優美,從而實現高效編程。
本文針對這 3 個可變類型,提煉出 5 個高頻問題,吃透這幾個高階編程技巧。
如何在列表、字典、集合中根據條件篩選數據
如何統計序列中元素的出現頻率
如何根據字典中值的大小,對字典中的項進行排序
如何快速找到多個字典中的公共鍵
如何讓字典保持有序
1.如何在列表、字典、集合中根據條件篩選數據
列表
- filter 函數 filter(lambda x : x>=0, data) 
- 列表解析 [x for x in data if x >= 0] 
- 字典 
- 字典解析 {k : v for k, v in d.iteritems() if v > 90} 
 
- 集合 
- 集合解析 {x for x in s if x%3 == 0} 
 - 列表 >>>?from?random?import?randint >>>?data?=?[randint(-10,?10)?for?_?in?range(10)] >>>?data [2,?-9,?2,?-2,?-10,?-2,?-1,?8,?3,?3] >>>?filter(lambda?x:?x?>=?0,?data) [2,?2,?8,?3,?3] >>>?[x?for?x?in?data?if?x?>=?0] [2,?2,?8,?3,?3]- 即使 filter 函數執行更快,耐不住列表解析既優美又連貫。工作中大家很愛用列表解析,推薦指數五顆星。 - 字典和集合 #?字典 >>>?d?=?{x:?randint(60,?100)?for?x?in?range(1,?11)} >>>?d {1:?61,?2:?71,?3:?86,?4:?79,?5:?64,?6:?88,?7:?71,?8:?88,?9:?94,?10:?65} >>>?{k:?v?for?k,?v?in?d.items()?if?v?>?90} {9:?94}#?集合 >>>?data [2,?-9,?2,?-2,?-10,?-2,?-1,?8,?3,?3] >>>?s?=?set(data) >>>?s set([2,?3,?8,?-2,?-10,?-9,?-1]) >>>?{x?for?x?in?s?if?x?%?3?==?0} set([3,?-9])- 可以看到解析的方式代碼很連貫,對于任何一個可迭代對象都可以用同樣的邏輯去code。 - 2.如何統計序列中元素的出現頻率
- 隨機序列中元素頻率統計 
- 詞頻統計:找出出現次數最高的 5 個單詞,及出現次數 >>>?from?random?import?randint
>>>?data?=?[randint(0,?5)?for?_?in?range(10)]
>>>?data
[5,?3,?4,?4,?1,?0,?5,?2,?0,?2]
#?不依賴庫生算
>>>?c?=?dict.fromkeys(data,?0)
>>>?c
{0:?0,?1:?0,?2:?0,?3:?0,?4:?0,?5:?0}
>>>?for?x?in?data:?c[x]?+=?1
>>>?c
{0:?2,?1:?1,?2:?2,?3:?1,?4:?2,?5:?2}
>>>?sorted(c.items(),?key=lambda?c:?c[1])
[(1,?1),?(3,?1),?(0,?2),?(2,?2),?(4,?2),?(5,?2)]#?用Counter庫
>>>?from?collections?import?Counter
>>>?c2?=?Counter(data)
>>>?c2
Counter({0:?2,?2:?2,?4:?2,?5:?2,?1:?1,?3:?1})
>>>?c2.most_common(3)
[(0,?2),?(2,?2),?(4,?2)]
- 利用 zip 將字典數據轉化為元組 
- 傳遞 sorted 函數的 key 參數 >>>?d?=?{x:?randint(60,?100)?for?x?in?'xyzabc'}
>>>?d
{'a':?66,?'c':?77,?'b':?65,?'y':?85,?'x':?64,?'z':?83}
#?對字典排序是返回key的排序結果
>>>?sorted(d)
['a',?'b',?'c',?'x',?'y',?'z']#?利用zip將鍵值對轉化為(值,鍵)的元組
>>>?zip(d.values(),?d.keys())
[(66,?'a'),?(77,?'c'),?(65,?'b'),?(85,?'y'),?(64,?'x'),?(83,?'z')]
>>>?sorted(zip(d.values(),?d.keys()))
[(64,?'x'),?(65,?'b'),?(66,?'a'),?(77,?'c'),?(83,?'z'),?(85,?'y')]#?傳遞sorted函數的key參數
>>>?d.items()
[('a',?66),?('c',?77),?('b',?65),?('y',?85),?('x',?64),?('z',?83)]
>>>?sorted(d.items(),?key=lambda?d:?d[1])
[('x',?64),?('b',?65),?('a',?66),?('c',?77),?('z',?83),?('y',?85)]
- 使用遍歷硬編碼 
- 使用字典的 keys()方法,得到一個字典 keys 的集合,利用集合 set()的交集操作 
- 使用 map 函數,得到所有字典的 keys 集合,再使用 reduce 函數, 取所有字典的 keys 的集合的交集 >>>?from?random?import?randint,?sample
>>>?s1?=?{x:?randint(1,?4)?for?x?in?sample('abcdefg',?randint(3,?6))}
>>>?s1
{'b':?2,?'d':?4,?'c':?1,?'e':?3,?'a':?1}
>>>?s2?=?{x:?randint(1,?4)?for?x?in?sample('abcdefg',?randint(3,?6))}
>>>?s3?=?{x:?randint(1,?4)?for?x?in?sample('abcdefg',?randint(3,?6))}
>>>?s2
{'g':?3,?'e':?4,?'d':?3,?'a':?4}
>>>?s3
{'d':?1,?'f':?1,?'e':?4,?'g':?4,?'b':?1}#?遍歷生算
>>>?res?=?[]
>>>?for?k?in?s1:
...?????if?k?in?s2?and?k?in?s3:
...?????????res.append(k)
...
>>>?res
['d',?'e']#?集合&求交集
>>>?s1.keys()?&?s2.keys()?&?s3.keys()
{'d',?'e'}#?map?函數?+?reduce?函數
>>>?map(dict.keys,?[s1,?s2,?s3])
<map?object?at?0x1028d2a90>
>>>?list(map(dict.keys,?[s1,?s2,?s3]))
[dict_keys(['b',?'d',?'c',?'e',?'a']),?dict_keys(['g',?'e',?'d',?'a']),?dict_keys(['d',?'f',?'e',?'g',?'b'])]
>>>?from?functools?import?reduce
>>>?reduce(lambda?a,?b:?a?&?b,?map(dict.keys,?[s1,?s2,?s3]))
{'d',?'e'}
Counter 神奇在于一鍵解決詞頻統計問題,在自然語言處理上大有妙用。
>>>?import?re #?待統計詞頻的文本 >>>?txt="As?we?all?know,?environment?pollution?and?energy?waste?have?become?some?of?the?most?important?topics?in?this?world.?The?best?way?to?solve?these?problems?is?to?live?a?low-carbon?life.?" >>>?c3?=?Counter(re.split('\W+',?txt)) >>>?c3 Counter({'to':?2,?'and':?1,?'':?1,?'all':?1,?'energy':?1,?'some':?1,?'life':?1,?'have':?1,?'in':?1,?'carbon':?1,?'best':?1,?'environment':?1,?'live':?1,?'low':?1,?'way':?1,?'waste':?1,?'topics':?1,?'we':?1,?'problems':?1,?'most':?1,?'important':?1,?'know':?1,?'world':?1,?'The':?1,?'is':?1,?'a':?1,?'this':?1,?'of':?1,?'these':?1,?'As':?1,?'solve':?1,?'become':?1,?'the':?1,?'pollution':?1}) >>>?c3.most_common(5) [('to',?2),?('and',?1),?('',?1),?('all',?1),?('energy',?1)]3.如何根據字典值的大小對項排序
靈活掌握內置函數的功能,會讓你日常工作增效百倍。但是功能不可能是記全的,理解函數可以實現什么,那些標準執行過程一定有標準實現。
4.如何快速找到多個字典中的公共鍵
5.如何讓字典保持有序
>>>?d?=?{} >>>?d['Jim']?=?(1,?35) >>>?d['Leo']?=?(2,?37) >>>?d['Bob']?=?(3,?40) >>>?d {'Jim':?(1,?35),?'Leo':?(2,?37),?'Bob':?(3,?40)} >>>?for?k?in?d: ...?????print(k) ... Jim Leo Bob上述字典實際上是無序的,無法保證其按排名順序輸出,雖然這個例子中是增序的。
>>>?from?collections?import?OrderedDict >>>?d?=?OrderedDict() >>>?d['Jim']?=?(1,?35) >>>?d['Leo']?=?(2,?37) >>>?d['Bob']?=?(3,?40) >>>?d OrderedDict([('Jim',?(1,?35)),?('Leo',?(2,?37)),?('Bob',?(3,?40))]) >>>?for?k?in?d: ...?????print(k) ... Jim Leo BobPython基礎部分還有可迭代對象、類等,這些在高階編程中很有用,尤其是在數據分析中會自建一些代碼工具。后面幾篇會覆蓋這些內容。
再往后會有數據分析三劍客:Numpy、Pandas和Matplotlib,以及隨后的經典機器學習算法。
我的學習過程很苦,希望你們不苦。如果苦的話,有我陪你。
推薦閱讀
Pandas處理數據太慢,來試試Polars吧!
懶人必備!只需一行代碼,就能導入所有的Python庫
絕!關于pip的15個使用小技巧
介紹10個常用的Python內置函數,99.99%的人都在用!
可能是全網最完整的 Python 操作 Excel庫總結!
總結
以上是生活随笔為你收集整理的Python可变数据类型高效编程的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 怎样用“python”快速入门数据分析?
- 下一篇: 再见,Visio!
