提取、替换和转换Python列表(数组)的特定元素

商业

要在 Python 中通过提取或删除现有列表 (数组) 中满足某些条件的元素来生成一个新的列表,或者通过进行替换或转换,请使用列表理解。

这里解释一下,并附有示例代码。

  • 列表理解符号的基本形式
  • 将该过程应用于列表中的所有元素
  • 从列表中提取并删除符合标准的元素
  • 替换或转换满足列表条件的元素

关于字符串列表的具体例子,请参见下面的文章。

也可以随机提取不符合标准的元素。

注意,列表可以存储不同类型的数据,与数组有严格的区别。如果你想在需要内存大小和内存地址的过程中处理数组,或者对大数据进行数值处理,请使用array(标准库)或NumPy。

下面的列表是一个例子

l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

列表理解符号的基本形式

当从一个列表中生成一个新的列表时,列表理解法比for循环更容易编写。

[expression for any variable name in iterable object if conditional expression]

一个表达式被应用于满足可迭代对象(如列表或元组)的条件表达式的元素,并成为新列表的一个元素。可以省略 “如果条件表达式”,在这种情况下,表达式被应用于所有元素。

更多的细节,包括嵌套的列表理解符号,见下面的文章。

将该过程应用于列表中的所有元素

例如,如果你想对一个列表的所有元素进行一些处理,在上面的列表理解表达式中描述所需的处理。

l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]

l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']

这可以用于数字列表和字符串列表之间的转换。

从列表中提取并删除符合标准的元素

如果该元素只需被条件表达式选择,它就不会被表达式处理,所以它采取以下形式

[variable name for variable name in original list if conditional expression]

一个新的列表被生成,从中只提取满足条件的元素(条件表达式为真的元素)。

l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]

l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]

如果 “如果条件表达式 “被设置为 “如果不是条件表达式”,它就变成了一个否定式,只有不满足条件的元素(条件表达式为假的元素)可以被选择和提取。换句话说,一个新的列表被生成,满足条件的元素被从中删除。

l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

当然,不使用not,通过指定等价的条件表达式也可以得到同样的结果。

l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

条件表达式部分可以是多个条件。也可以使用负的nots。

l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]

l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]

替换或转换满足列表条件的元素

在上述提取元素的例子中,不满足条件的元素被删除。

如果你想只对满足条件的元素进行替换、转换等,请将三元操作符应用于列表理解符号的表达部分。

在Python中,三元运算符可以写成如下形式

True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100

b = 30
y = 100 if b > 50 else 0
print(y)
# 0

这有点复杂,但列表理解符号和三元运算符的组合如下。

[True Value if Conditional Expression else False Value for any variable name in original list]

括号内的部分是三元运算符(实际代码中不需要括号)。

[(True Value if Conditional Expression else False Value) for any variable name in original list]

如果任何变量名被写成真或假的值,那么原始元素的值将被原样使用。如果写了一个表达式,则应用该表达式的处理。

l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]

l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]

l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]

l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]