Python实用小技巧
1. 根据对象属性进行排序
sorted 函数有关键字参数 key 可以传入一个 callable 对象给它,这个对象对每个传入的参数对象返回一个值 这个值会被 sordid\ted用来排序
# sorted 函数有关键字参数 key 可以传入一个 callable 对象给它
# 这个对象对每个传入的参数对象返回一个值 这个值会被 sordid\ted用来排序
class User(object):
def __init__(self, user_id):
self.user_id = user_id
def __repr__(self):
return "User({})".format(self.user_id)
users = [User(23), User(3), User(99)]
def sort_notcompare():
print(users)
print(sorted(users, key=lambda u: u.user_id))
# sort_notcompare()
print('*' * 50)
# 也可以使用 operator.attrgetter() 代替 lambda 函数:
from operator import attrgetter
print(users)
print(sorted(users, key=attrgetter('user_id')))
# attrgetter() 函数通常比lambda函数效率高点 同样和 itemgetter()函数一样 可以对
# 对象多个属性进行排序 同样可以作用于 min() max()之类的函数
2. 审查清理文本字符串
文本清理问题会涉及到包括文本解析与数据处理等问题,比如先将字符串标准化 然后使用 replace 等函数替换或者删除字符
import sys
import unicodedata
s = 'pýtĥöñ\fis\tawesome\r\n'
print(s)
remap = {
ord('\t'): ' ',
ord('\f'): ' ',
ord('\r'): None # Deleted
}
a = s.translate(remap)
print(a)
print('#' * 50)
# 进一步构建更强大的表格 比如删除所有和音符
cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode)
if unicodedata.combining(chr(c)))
b = unicodedata.normalize('NFD', a)
print(b)
print(b.translate(cmb_chrs))
# 上面的例子中 使用 dict.fromkeys 方法构建一个字典 每个 unicode和音符作为键对应的值全部为 None
# 然后使用 unicodedata.normalize() 将原始输入标准化为分解形式字符
# 然后再调用 translate 函数删除所有重音符?
这样可以直接替换掉文中的多余字符。
3. unicode文本标准化
可以将Unicode编码的字符转成正常的字符串。但处理unicode 字符串需要确保所有字符串在底层有相同表示
# 处理 unicode 字符串 需要确保所有字符串在底层有相同表示
import unicodedata
s1 = 'Spicy Jalape\u00f1o'
s2 = 'Spicy Jalapen\u0303o'
print(s1)
print(s2)
print(s1 == s2)
print(s1 == s2)
print(len(s1))
print(len(s2))
print('*' * 50)
# 需要比较字符串的程序中使用字符多种表示可能会产生问题
# 需要先将文本标准化
t1 = unicodedata.normalize('NFC', s1)
t2 = unicodedata.normalize('NFC', s2)
print(t1 == t2)
print(ascii(t1))
t3 = unicodedata.normalize('NFD', s1)
t4 = unicodedata.normalize('NFD', s2)
print(t3 == t4)
print(ascii(t3))
# normalize 第一个参数指定字符串标准化的方式 NFC 表示字符串应该是整体组成
# 而 NFD 表示字符应该分解为多个组合字符表示
4. 指定列宽格式化字符串
使用 textwrap 模块来格式化字符串的输出。比如,假如你有下列的长字符串,使用textwrap后,它们只会显示在一个指定的范围宽度内
import textwrap
s = "Look into my eyes, look into my eyes, the eyes, the eyes, \
the eyes, not around the eyes, don't look around the eyes, \
look into my eyes, you're under."
print(textwrap.fill(s, 70))
print(textwrap.fill(s, 40))
print(textwrap.fill(s, 40, initial_indent=' '))
print(textwrap.fill(s, 40, subsequent_indent=' '))
# textwrap 模块对于字符串打印是非常有用的,
# 特别是当你希望输出自动匹配终端大小的时候。
5.defaultdict的使用
使用普通的字典时,用法一般是dict={},添加元素的时候dict[element] =value即可,调用的时候也是如此,dict[element] = xxx,但前提是element字典里,如果不在字典里就会报错,这时defaultdict就能排上用场了,defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值。
from collections import defaultdict
dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
dict1[2] ='python'
print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])