1.数据结构与算法相关问题与解决技巧

一. 分割字符串问题

已知字符串"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())]

 

3. 留下集合中的3的倍数


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值