python-进阶教程-对列表中的元素进行筛选

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)
#result:[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)

其中的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)
#result:['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)
#result:[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)
#result:[False, False, True, False, False, True, True, False]
a = list(compress(addresses, more5))
print(a)
#result:['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']

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

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

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

### 回答1: 可以使用列表的remove()方法来删除指定元素,例如: ```python my_list = [1, 2, 3, 4, 5] my_list.remove(3) print(my_list) # 输出 [1, 2, 4, 5] ``` 如果要删除列表的多个元素,可以使用循环和条件语句来实现,例如: ```python my_list = [1, 2, 3, 4, 5] to_remove = [2, 4] for item in to_remove: if item in my_list: my_list.remove(item) print(my_list) # 输出 [1, 3, 5] ``` 另外,还可以使用列表的pop()方法来删除指定位置的元素,例如: ```python my_list = [1, 2, 3, 4, 5] my_list.pop(2) print(my_list) # 输出 [1, 2, 4, 5] ``` 需要注意的是,pop()方法会返回被删除的元素,如果不需要返回值,可以忽略它。 ### 回答2: Python 删除列表元素的方法有多种,以下是其的几种方法。 1. del 语句删除元素:直接使用 del 语句从列表删除指定元素。 ```python my_list = [1, 2, 3, 4, 5] del my_list[2] # 删除第三个元素(值为3) print(my_list) # [1, 2, 4, 5] ``` 2. pop() 方法删除元素:使用 pop() 方法删除列表指定位置的元素,默认为最后一个元素。 ```python my_list = [1, 2, 3, 4, 5] my_list.pop(2) # 删除第三个元素(值为3) print(my_list) # [1, 2, 4, 5] ``` 3. remove() 方法删除元素:使用 remove() 方法删除列表第一个匹配的元素。 ```python my_list = [1, 2, 3, 2, 5] my_list.remove(2) # 删除第一个值为2的元素 print(my_list) # [1, 3, 2, 5] ``` 需要注意的是,如果要从列表删除多个匹配元素,可以使用循环或列表推导式等方式;还可以使用切片操作删除一段连续的元素。 值得注意的是,当删除列表元素时,删除后列表的索引也会相应地改变,因此在迭代列表时需要特别小心,否则会影响迭代结果和实现的逻辑。 ### 回答3: 在Python,我们可以通过多种方式从列表删除一个元素。下面我们将介绍几种常用的方法。 1. 使用del关键字 del关键字可以删除列表的任意一个元素,但是你需要知道要删除的元素的索引值。 例如,我们有一个列表a=[1,2,3,4,5],如果我们想删除第三个元素,可以使用以下代码: del a[2] # 删除第三个元素3(Python下标从0开始) 执行完上述代码后,a列表就变成了[1,2,4,5]。 2. 使用remove方法 remove方法可以根据元素的值来删除一个元素,而不需要知道元素的索引值。 例如,我们有一个列表a=[1,2,3,4,5],如果我们想删除元素3,可以使用以下代码: a.remove(3) # 删除元素3 执行完上述代码后,a列表就变成了[1,2,4,5]。 需要注意的是,remove方法只会删除第一个匹配的元素。如果要删除所有匹配的元素,需要使用循环和判断来实现。 3. 使用pop方法 pop方法可以删除指定索引位置的元素,并返回被删除的元素。 例如,我们有一个列表a=[1,2,3,4,5],如果我们想删除第二个元素,可以使用以下代码: a.pop(1) # 删除第二个元素2 执行完上述代码后,a列表就变成了[1,3,4,5]。同时,pop方法返回被删除的元素2。 需要注意的是,如果不指定索引值,pop方法默认会删除最后一个元素。如果列表为空,pop方法会引发IndexError异常。 以上就是从列表删除元素的几种方法。在实际应用,我们需要根据具体情况选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值