对列表中的元素进行筛选

部署运行你感兴趣的模型镜像
0.摘要

本文主要介绍根据给定条件对列表中的元素进行筛序,剔除异常数据,并介绍列表推导式和生成表达式两种方法。。

1.列表推导式(list comprehension)
mylist = [1, 2, 3, -4, -5, 6, 7, 8, 9]
positive_list = [n for n in mylist if n > 0 ]
print(positive_list)

Out[12]:
[1, 2, 3, 6, 7, 8, 9]

优点:简单。列表推导式的实现非常简单,在数据量不大的情况下很实用。

缺点:占用内存大。由于列表推导式采用for循环一次性处理所有数据,当原始输入非常大的情况下,需要占用大量的内存空间。

2.生成器表达式
mylist = [1, 2, 3, -4, -5, 6, 7, 8, 9]
pos = (n for n in mylist if n > 0 )
print(pos)
for x in pos:
    print(x)
    
Out[13]:
<generator object <genexpr> at 0x00000000059FF948>
1
2
3
6
7
8
9

其中的pos是我们构建的一个生成器,通过print()函数可以证实:

<generator object <genexpr> at 0x000000DD6A9D0200>

相比于列表推导式,生成器表达式每次只处理一个数据,而不是处理整个数据结构,因此更加节约内存。

结论:处理少量数据用列表推导式,处理大量数据用生成器表达式

3.更复杂的筛选条件

有的时候筛选的标准并非如此简单,甚至涉及到异常处理等细节,这个时候可以先将复杂的筛选条件写入函数,该函数返回bool值,然后利用Python内建filter()函数进行处理。

values = ['1','-123', 'N/A', '-', '+369', 'hello']
 
def is_int(val):
    try:
        x = int(val)
        return True
    except ValueError:
        return False
 
ivals = list(filter(is_int, values))
print(ivals)

Out[14]:
['1', '-123', '+369']

利用int()转换函数和异常处理函数实现的对int型数据的判断;

filter()函数创建了一个迭代器,前面的list是将该迭代器转换为list数据。

4.实用操作

在使用列表推导式和生成器表达式筛选数据的过程,还可以附带着进行数据的处理工作。

mylist = [1, 4, -5, 10, -7, 2, 3, -1]
 
neg_clip = [n**2 if n > 0 else 0 for n in mylist]
print(neg_clip)
#result:[1, 16, 0, 100, 0, 4, 9, 0]
 
import math
pos_clip = [n if n < 0 else math.sqrt(n) for n in mylist]
print(pos_clip)

Out[16]:
[1, 16, 0, 100, 0, 4, 9, 0]
[1.0, 2.0, -5, 3.1622776601683795, -7, 1.4142135623730951, 1.7320508075688772, -1]

另外,介绍一个筛选工具:itertools.compress(),

addresses = [
    '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]
 
from itertools import compress
 
more5 = [ n > 5 for n in counts ]
print(more5)

a = list(compress(addresses, more5))
print(a)

Out[17]:
[False, False, True, False, False, True, True, False]
['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']

这里的 more5 将大于5的值替换为 True,其余替换为 False。

itertools.compress(data, selectors):该函数会根据selectors中元素的bool值筛选data对应位置的元素,并返回一个迭代器。因此,需要对返回值取list才能查看结果。

相比于filter()函数,itertools.compress() 形式更简单,不需要构建额外的函数。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### Java 中筛选列表元素的方法 在 Java 中,`Stream API` 提供了一种简洁而强大的方式来处理集合数据。通过 `filter()` 方法可以从 `List` 中筛选出符合条件的元素。 #### 使用 `filter()` 方法筛选 List 数据 下面展示了一个具体的例子,该例子创建两个字符串类型的 `List` 并利用 `Stream.filter()` 来获取仅存在于第一个列表中的项: ```java import java.util.*; import java.util.stream.Collectors; public class Example { public static void main(String[] args) { // 定义两个列表 List<String> listA = Arrays.asList("apple", "banana", "orange", "grape"); List<String> listB = Arrays.asList("banana", "kiwi", "grape"); // 筛选出只属于 listA 不属于 listB 的元素 List<String> result = listA.stream() .filter(item -> !listB.contains(item)) .collect(Collectors.toList()); System.out.println(result); } } ``` 这段代码会输出 `[apple, orange]` 表明这些水果仅仅出现在 `listA` 而不在 `listB` 中[^1]。 #### 结合 `map()` 和 `filter()` 处理复杂逻辑 当需要更复杂的变换时,还可以组合使用 `map()` 函数来进行映射操作后再做进一步过滤: ```java // 假设有一个包含整数的对象列表 List<Integer> numbers = Arrays.asList(1, 2, 3, 4); // 将每个数字乘以二之后再保留偶数值的结果集 List<Integer> doubledEvens = numbers.stream() .map(n -> n * 2) .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(doubledEvens); // 输出 [2, 4, 6, 8] ``` 此段代码先将原始数组里的每一个元素翻倍(`map`),接着移除奇数留下所有的偶数(`filter`)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值