72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
# 比如我有一个列表
|
||
mylist = [1,4,-5,10,-7,2,3,-1]
|
||
|
||
# 最脑瘫的方法就是用列表推导式重新生成一遍
|
||
filted_list_b0 = [x for x in mylist if x > 0]
|
||
filted_list_s0 = [x for x in mylist if x < 0]
|
||
# print(filted_list_b0)
|
||
|
||
|
||
|
||
# 当然如果列表很大,这样做会裂开,因为列表推导式本质上是遍历,会建立一份mylist的复制
|
||
# 这个时候我们可以用生成器的方式表达解析结果以节省内存
|
||
filted_list_b0 = (x for x in mylist if x > 0)
|
||
# for i in filted_list_b0:
|
||
# print(i)
|
||
|
||
|
||
|
||
# 当然有的列表比较抽象:
|
||
mylist_suka = ['1', '2', '-3', '-', '4', 'N\A', '5']
|
||
|
||
# 这个时候我们可以先写逻辑进行过滤:
|
||
def drop_suka(val):
|
||
try:
|
||
x = int(val)
|
||
return True
|
||
except ValueError:
|
||
return False
|
||
|
||
|
||
# 然后我们用内建的filter函数进行过滤,
|
||
# 第一个位置是一个值判断布尔函数,第二个参数是要过滤的列表,布尔函数里写过滤逻辑;
|
||
# filter返回一个迭代器,所以可以直接用list方法转成列表
|
||
my_nonsuka_list = list(filter(drop_suka, mylist_suka))
|
||
# print(my_nonsuka_list)
|
||
|
||
|
||
|
||
# 列表推导式和生成器推导式都可以在值的位置进行:
|
||
# 1.计算 x*2
|
||
# 2.三元判断 x*2 if x < 1 else x
|
||
filted_list_b0 = [x*2 if x < 1 else x for x in mylist if x > 0]
|
||
filted_list_b0 = (x*2 if x < 1 else x for x in mylist if x > 0)
|
||
|
||
|
||
|
||
# 如果要筛选的元素在另一个列表里怎么办?比如我们有:
|
||
rows = [
|
||
"5412 N CLARK",
|
||
"5148 N CLARK",
|
||
"5800 E 58TH",
|
||
"2122 N CLARK",
|
||
"5645 N RAVENSWOOD",
|
||
"1060 W ADDISON",
|
||
"4801 N BROADWAY",
|
||
"1039 W GRANVILLE",
|
||
]
|
||
|
||
counts = [0,3,10,4,1,7,6,1]
|
||
|
||
# counts表示rows里面对应元素出现的次数,如果我们想找count>5的元素咋整?
|
||
# 1.搞一个布尔列表,告诉程序谁才是我们要的
|
||
wanted = [n > 5 for n in counts] # 这和[n for n in counts if n > 5]不一样,之前是在for的同时筛选,现在是for完看看是否符合n>5
|
||
# print(wanted)
|
||
# 2.用itertools的compress函数来进行对比
|
||
from itertools import compress
|
||
|
||
# itertools里的compress函数输入一个列表和一个布尔列表,返回一个迭代器,里面是列表中同样位置在布尔列表里为True的元素
|
||
result = list(compress(rows, wanted))
|
||
print(result)
|
||
|