一. 分割字符串问题
已知字符串"ab;cd|efg|hi,jk1|mn\topq;rst,uvw\txyz",
其中的',' ';' '|' '\t' 都是分割符,如何处理?
方法1、 连续使用str.split
s = "ab;cd|efg|hi,jk1|mn\topq;rst,uvw\txyz"
def my_split(s, seps):
res = [s]
for sep in seps:
t = []
map(lambda ss: t.extend(ss.split(sep)), res)
res = t
return res
print(my_split(s, ',;|\t'))
结果
['ab', 'cd', 'efg', 'hi', 'jk1', 'mn', 'opq', 'rst', 'uvw', 'xyz']
或者通过reduce
from functools import reduce
my_split2 = lambda s, seps: reduce(lambda l, sep: sum(map(lambda ss: ss.split(sep), l), []), seps, [s])
print(my_split2(s, ',;|\t'))
结果
['ab', 'cd', 'efg', 'hi', 'jk1', 'mn', 'opq', 'rst', 'uvw', 'xyz']
此方法因为不方便阅读,所以不推荐
方法2、 正则表达式re.split方法(推荐)
import re
print(re.split('[;,|\t]+', s))
结果
['ab', 'cd', 'efg', 'hi', 'jk1', 'mn', 'opq', 'rst', 'uvw', 'xyz']
二. 如何在列表、字典、集合中根据条件筛选数据?
1. 过滤掉列表中的负数
使用列表解析方法
from random import randint
# 生成一个10个随机数组成的数组
l = [randint(-10,10) for _ in range(10)]
# 列表解析过滤掉负数
[x for x in l if x>=0]
使用filter
g = filter(lambda x: x>= 0, l) # filter会返回生成器对象
list(g) # g不能在调用next后再 用list
2. 找出分数大于90的学生
字典解析方法
# 创建一个班级的分数
d = {'student%d' %i: randint(50, 100) for i in range(1,21)}
# 找到分数90分以上的同学
{k:v for k, v in d.items() if v>= 90}
使用filter
[filter(lambda item: item[1] >= 90, d.items())]