一些实用Python函数

eval() – 字符串表达式处理

eval() 函数用来执行一个字符串表达式,并返回表达式的值。
1
2
3
4
5
6
7
8
9
10
>>>x = 7
>>>eval( '3 * x' )
21
>>> eval('pow(2,2)')
4
>>> eval('2 + 2')
4
>>> n=81
>>> eval("n + 4")
85

re.escape(pattern) – 大段语句防止被转义

re.escape(pattern) 可以对字符串中所有可能被解释为正则运算符的字符进行转义的应用函数。如果字符串很长且包含很多特殊技字符,而你又不想输入一大堆反斜杠,或者字符串来自于用户(比如通过raw_input函数获取输入的内容),且要用作正则表达式的一部分的时候,可以使用这个函数。

1
2
3
4
5
>>> re.escape('www.python.org')
'www\\.python\\.org'

>>>re.findall(re.escape('w.py'),"jw.pyji w.py.f")
['w.py', 'w.py']

str.maketrans(intab,outtab[,delchars])–创建字符翻译映射表

  • intab – 需要转换的字符组成的字符串。

  • outtab – 转换的目标字符组成的字符串。

  • delchars – 可选参数,表示要删除的字符组成的字符串。翻译前删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
intab = "aeiou"
outtab = "12345"
deltab = "thw"

trantab1 = str.maketrans(intab,outtab) # 创建字符映射转换表
trantab2 = str.maketrans(intab,outtab,deltab) #创建字符映射转换表,并删除指定字符

test = "this is string example....wow!!!"

print(test.translate(trantab1))
print(test.translate(trantab2))
print(test.translate(trantab1,'xm'))

输出结果:
th3s 3s str3ng 2x1mpl2....w4w!!!
3s 3s sr3ng 2x1mpl2....4!!!
th3s 3s str3ng 21pl2....w4w!!!

.translate(table[, deletechars])一起使用

  • table – maketrans方法生成的对象

  • deletechars – 翻译完成后字符串中要过滤的字符列表

divmod(a,b):

 divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。
1
2
3
4
5
6
7
8
 >>>divmod(7, 2)
(3, 1)

>>> divmod(8, 2)
(4, 0)

>>> divmod(1+2j,1+0.5j)
((1+0j), 1.5j)

zip():

zip([iterable, ...])

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。

我们可以使用 list() 转换来输出列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped) # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c)) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]

>>> a1, a2 = zip(*zip(a,b)) # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
>>>

需要注意的是zip()函数创建的是一个只能访问一次的迭代器。比如,下面的代码就会产生错误

1
2
3
prices_and_names = zip(prices.values(), prices.keys())
print(min(prices_and_names)) # OK
print(max(prices_and_names)) # ValueError: max() arg is an empty sequence

collections.Counter():

是一个计数器,返回一个类字典类型数据。

1.创建:

1
2
3
4
>>> c = Counter()  # 创建一个空的Counter类
>>> c = Counter('gallahad') # 从一个可iterable对象(list、tuple、dict、字符串等)创建
>>> c = Counter({'a': 4, 'b': 2}) # 从一个字典对象创建
>>> c = Counter(a=4, b=2) # 从一组键值对创建

2.计数器的更新(update和subtract):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 增加使用update()
>>> c = Counter('which')
>>> c.update('witch') # 使用另一个iterable对象更新
>>> c['h']
3
>>> d = Counter('watch')
>>> c.update(d) # 使用另一个Counter对象更新
>>> c['h']
>>> c = Counter('which')
>>> c.update('witch') # 使用另一个iterable对象更新
>>> c['h']
3
>>> d = Counter('watch')
>>> c.update(d) # 使用另一个Counter对象更新
>>> c['h']
4
1
2
3
4
5
6
7
8
9
# 减少使用subtract()
>>> c = Counter('which')
>>> c.subtract('witch') # 使用另一个iterable对象更新
>>> c['h']
1
>>> d = Counter('watch')
>>> c.subtract(d) # 使用另一个Counter对象更新
>>> c['a']
-1

一些方法:

elements():
返回一个迭代器。元素被重复了多少次,在该迭代器中就包含多少个该元素。元素排列无确定顺序,个数小于1的元素不被包含。
1
2
3
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
most_common([n]):
返回一个TopN列表。如果n没有被指定,则返回所有元素。当多个元素计数值相同时,排列是无确定顺序的。
1
2
3
4
5
>>> c = Counter('abracadabra')
>>> c.most_common()
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
>>> c.most_common(3)
[('a', 5), ('r', 2), ('b', 2)]

算术和集合操作:

+、-、&、|操作也可以用于Counter。其中&和|操作分别返回两个Counter对象各元素的最小值和最大值。需要注意的是,得到的Counter对象将删除小于1的元素。
1
2
3
4
5
6
7
8
9
10
>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d # c[x] + d[x]
Counter({'a': 4, 'b': 3})
>>> c - d # subtract(只保留正数计数的元素)
Counter({'a': 2})
>>> c & d # 交集: min(c[x], d[x])
Counter({'a': 1, 'b': 1})
>>> c | d # 并集: max(c[x], d[x])
Counter({'a': 3, 'b': 2})

常用操作:

1
2
3
4
5
6
7
8
9
10
11
sum(c.values())  # 所有计数的总数
c.clear() # 重置Counter对象,注意不是删除
list(c) # 将c中的键转为列表
set(c) # 将c中的键转为set
dict(c) # 将c中的键值对转为字典
c.items() # 转为(elem, cnt)格式的列表
Counter(dict(list_of_pairs)) # 从(elem, cnt)格式的列表转换为Counter类对象

c.most_common()[:-n:-1] # **取出计数最少的n-1个元素

c += Counter() # **移除0和负值

注:

计数值的访问与缺失的键:
当所访问的键不存在时,返回0,而不是KeyError;否则返回它的计数。
1
2
3
4
5
6
7
>>> c = Counter("abcdefgab")
>>> c["a"]
2
>>> c["c"]
1
>>> c["h"]
0
键的删除:
当计数值为0时,并不意味着元素被删除,删除元素应当使用del。
1
2
3
4
5
6
7
8
9
10
>>> c = Counter("abcdcba")
>>> c
Counter({'a': 2, 'c': 2, 'b': 2, 'd': 1})
>>> c["b"] = 0
>>> c
Counter({'a': 2, 'c': 2, 'd': 1, 'b': 0})
>>> del c["a"]
>>> c
Counter({'c': 2, 'b': 2, 'd': 1})


一些实用Python函数
http://blog.rainna.xyz/2022/04/17/2022-04-17-methods/
作者
rainnalv
发布于
2022年4月17日
许可协议