這里是本人收集的一些 Python 小技巧,目前主要是一些實(shí)用函數(shù)业踢,適合有一定基礎(chǔ)的童鞋觀看(不會(huì)專門介紹使用到的標(biāo)準(zhǔn)庫(kù)函數(shù))。秘蛔。
一陨亡、函數(shù)式編程
函數(shù)式編程用來(lái)處理數(shù)據(jù),感覺(jué)很方便深员。(要是再配上管道操作符 |
或者 Java 的那種鏈?zhǔn)秸{(diào)用负蠕,超級(jí)爽!可惜 Python 都沒(méi)有倦畅。遮糖。需要借助第三方庫(kù))
1. 分組/group
數(shù)據(jù)處理中一個(gè)常見(jiàn)的操作,是將列表中的元素叠赐,依次每 k 個(gè)分作一組欲账。
def group_each(a, size: int):
"""
將一個(gè)可迭代對(duì)象 a 內(nèi)的元素, 每 size 個(gè)分為一組
group_each([1,2,3,4], 2) -> [(1,2), (3,4)]
"""
iterators = [iter(a)] * size # 將新構(gòu)造的 iterator 復(fù)制 size 次(淺復(fù)制)
return zip(*iterators) # 然后 zip
這個(gè)函數(shù)之前在 Python 拾遺 - 奇技淫巧 中就寫過(guò)屡江,記得是某次 Google 時(shí)在 stackoverflow 上發(fā)現(xiàn)的,不過(guò)它的最初來(lái)源應(yīng)該是 Python 官方文檔的某個(gè)角落赛不。
順便如果某個(gè) size 比較常用(比如 2)惩嘉,還可以用 partial
封裝一下
from functools import partial
# 每?jī)蓚€(gè)分一組
group_each_2 = partial(group_each, size=2) # 等同于 group_each_2 = lambda a: group_each(a, 2)
2. 扁平版本的 map
稍微接觸過(guò)函數(shù)式應(yīng)該都知道 flat_map,可 Python 標(biāo)準(zhǔn)庫(kù)卻沒(méi)有提供踢故。下面是我在 stackoverflow 上找到的實(shí)現(xiàn)文黎,其實(shí)很簡(jiǎn)單
from itertools import chain
def flat_map(f, items):
return chain.from_iterable(map(f, items))
它和 map 的差別在于是不是扁平(flat) 的(廢話。殿较。)耸峭,舉個(gè)例子
>>> list(map(list, ['123', '456']))
[['1', '2', '3'], ['4', '5', '6']]
>>> list(flat_map(list, ['123', '456']))
['1', '2', '3', '4', '5', '6']
3. 上述函數(shù)的應(yīng)用舉例
在做爬蟲工作時(shí),有時(shí)會(huì)遇到這樣的 table 元素:
對(duì)這種 html 元素淋纲,我一般會(huì)直接把它轉(zhuǎn)換成 list劳闹,結(jié)果如下:
table = [['label1', 'value1', 'label2', 'value2'],
['label3', 'value3'],
['label4', 'value4', 'label5', 'value5'],
...
]
為了方便索引,現(xiàn)在我需要把上面的數(shù)據(jù)轉(zhuǎn)換成下面這個(gè)樣子的 dict
{
'label1': 'value1',
'label2': 'value2',
'label3': 'value3',
'label4': 'value4',
'label5': 'value5'
}
如果是平常洽瞬,大概需要寫循環(huán)了本涕。不過(guò)如果用剛剛說(shuō)到的幾個(gè)函數(shù)的話,會(huì)變得異常簡(jiǎn)單
# 1\. 分組
groups = flat_map(group_each_2, table)
# 1.1 flat_map 返回的是迭代器片任,list 后內(nèi)容如下:
# [('label1', 'value1'),
# ('label2', 'value2'),
# ('label3', 'value3'),
# ('label4', 'value4'),
# ('label5', 'value5')]
# 2\. 轉(zhuǎn)換成 dict
key_values = dict(groups) # 得到的 key_values 與上面需要的 dict 別無(wú)二致偏友。
二蔬胯、其他
1. 多 dict 的去重
假設(shè)我們有一個(gè) dict 的列表对供,里面可能有內(nèi)容一模一樣的 dict,我們需要對(duì)它做去重氛濒。
容易想到的方法就是使用 set产场,可是 set 中的元素必須是 hashable 的,而 dict 是 unhashable 的舞竿,因此不能直接放進(jìn) set 里京景。
>>> a = [{'a': 1}, {'a': 1}, {'b': 2}]
>>> set(a)
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 2961, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-5-5b4c643a6feb>", line 1, in <module>
set(a)
TypeError: unhashable type: 'dict'
難道就必須手寫遞歸了么?未必骗奖,我在 stackoverflow 看到這樣一個(gè)小技巧
import json
def unique_dicts(data_list: list):
"""unique a list of dict
dict 是 unhashable 的确徙,不能放入 set 中,所以先轉(zhuǎn)換成json
unique_dicts([{'a': 1}, {'a': 1}, {'b': 2}]) -> [{'a': 1}, {'b': 2}]
"""
data_json_set = set(json.dumps(item) for item in data_list)
return [json.loads(item) for item in data_json_set]
慢慢更新执桌,想到啥就加啥鄙皇。
本文允許轉(zhuǎn)載,但要求附上源地址 https://www.cnblogs.com/kirito-c/p/9610179.html