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 ])) |