在python list中筛选包含字符的字段方式

python list筛选包含字符的字段

1

2

3

l = [‘123a',‘456b',‘789c']

ll = [s for s in l if ‘a' in s]

这是通过判断语句

1

2

3

lst = [“123a”, “456b”, “789c”]

lst = list(filter(lambda x: x.find(“a”) >= 0, lst))

print(lst)

这是通过函数

Python 列表筛选数据

在做数据处理中,常会遇到列表筛选

比如有以下两个列表

 

根据上列表中的KEY1 , 筛选下列表的数据,也就是标黄的数据。数量不大的情况,一般就是遍历比较,逻辑简单,几行代码搞掂。

但如果列表达到万,或者百万、千万,那遍历效率就低了。

先构造测试的列表

1

2

3

4

5

6

7

8

9

10

11

# 构造筛选目标列表,确保KEY不重复

n1 = 30000

n1_set = set([random.randint(1,n1)  for n in range(n1)])

n1 = len(n1_set)

list1 = [['1108{:0>6d}27'.format(n), "".join(random.sample('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',10))] for n in n1_set]

  

# 构造待筛选数据列表,确保KEY不重复

n2 = 100000

n2_set = set([random.randint(1,n2)  for n in range(n2)])

n2= len(n2_set)

list2 = [['1108{:0>6d}27'.format(n), "".join(random.sample('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',5)),n ] for n in n2_set]

比较遍历、列表生成式+filter 、pandas 的 merge 三种方法效率

1

2

3

4

5

6

7

筛选目标18971条, 待处理数据63275

遍历生成数据 耗时11.591秒 获得数据量 12024

['11080000427', 'eArVD', 4]

filter 耗时11.5秒 获得数据量 12024

['11080000427', 'eArVD', 4]

merge 耗时0.058秒 获得数据量 12024

['11080000427', 'eArVD', 4]

1

2

3

4

5

6

7

筛选目标189733条, 待处理数据632363

遍历生成数据 耗时1597.4296秒 获得数据量 120180

['1108000000227', 'NkoEQ', 2]

filter 耗时1575.0432秒 获得数据量 120180

['1108000000227', 'NkoEQ', 2]

merge 耗时0.64秒 获得数据量 120180

['1108000000227', 'NkoEQ', 2]

经过比较, 直接遍历生成和列表生成式+filter的效率基本一致, pandas 的merge 效率最高。适合大批量数据处理。

上代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

print("筛选目标{}条, 待处理数据{}条".format(n1,n2))

  

# 直接遍历生成数据,计时

t1 = time.time()

list_temp = [n[0] for n in list1]

list3 = []

for n in list2:

    if n[0] in list_temp:

        list3.append(n)

t2 = time.time()

print("遍历生成数据 耗时{}秒".format(round(t2 - t1, 4)), "获得数据量", len(list3))

print(list3[0])

  

  

# 用filter筛选数据,计时

t1 = time.time()

list_temp = [n[0] for n in list1]

list3 = [n for n in filter(lambda x: x[0] in list_temp, list2)]

t2 = time.time()

print("filter 耗时{}秒".format(round(t2 - t1,4)), "获得数据量", len(list3))

print(list3[0])

  

  

# 用pd.merge 筛选数据,计时

t1 = time.time()

df1 = pd.DataFrame(list1, columns=['k1','m1'])

df2 = pd.DataFrame(list2, columns=['k1','m2','n2'])

df3 = pd.merge(df1[['k1']], df2, how='inner', on='k1')

t2 = time.time()

print("merge 耗时{}秒".format(round(t2 - t1,4)), "获得数据量", len(df3))

print(list(df3.iloc[0]))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jh035

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值