Python - 用序号替换列表元素。


在本文中,我们将学习如何用其序号替换任何给定的列表元素。我们将看到完成此工作的各种方法。在此之前,让我们了解一下序数。

序数 - 在数学中,我们将序数称为表示序列中列表项的位置或原始顺序的数字。

举一个列表的例子:[ 6, 8, 5, 3 ],这些数字的序数值将是 -

  • 第一个元素 (6) 的序数值为 1。

  • 第二个元素 (8) 的序数值为 2。

  • 第三个元素 (5) 的序数值为 3。

  • 第四个元素 (3) 的序数值为 4。

让我们看看用序数替换列表项的各种方法。

方法 1. 使用嵌套列表推导式结合 enumerate。

示例

List_items = [[6, 8, 5, 3], [22, 52, 13], [11], [35], [61, 15]]
replaced_ordinal_list = [[idx] * len(sublist) for idx, sublist in enumerate(List_items)]
print(replaced_ordinal_list)

输出

[[0, 0, 0, 0], [1, 1, 1], [2], [3], [4, 4]]

解释

在上面的程序中,我们使用了嵌套列表推导式。外部推导式迭代 List_items 中的每个子列表,内部推导式通过遍历每个内部子列表来生成列表。

方法 2. 使用嵌套循环。

示例

List_items = [[6, 8, 12, 15], [2, 5, 13], [1], [5, 5], [6, 15]]
replaced_ordinal_list = []
for idx, sublist in enumerate(List_items):
   ordinal_list = [idx] * len(sublist)
   replaced_ordinal_list.append(ordinal_list)
print(replaced_ordinal_list)

输出

[[0, 0, 0, 0], [1, 1, 1], [2], [3, 3], [4, 4]]

解释

在上面的程序中,我们使用嵌套 for 循环遍历每个子列表

在 List_items 中。在外部循环中遍历时,我们创建了序数列表,并将其索引乘以每个子列表的长度。

方法 3. 使用列表推导式结合 while 循环。

示例

List_items= [[6, 8, 12, 15], [2, 5, 13,], [1], [5, 2, 6], [6, 15]]
replaced_ordinal_list= []
idx = 0
while idx < len(List_items):
   ordinal_list = [idx] * len(List_items[idx])
   replaced_ordinal_list.append(ordinal_list)
   idx += 1
print(replaced_ordinal_list)

输出

[[0, 0, 0, 0], [1, 1, 1], [2], [3, 3, 3], [4, 4]]

解释

在上面的程序中,我们使用 while 循环遍历 List_items 中的每个子列表。在外部循环中遍历时,我们创建了一个序数列表

方法 4. 使用字典和 enumerate。

示例

import numpy as np

List_items= [[6, 8, 12, 15], [2, 5, 13,], [1], [5, 2, 6], [6, 15]]
replaced_ordinal_list= [{idx: sublist} for idx, sublist in enumerate(List_items)]
print(replaced_ordinal_list)

输出

[{0: [6, 8, 12, 15]}, {1: [2, 5, 13]}, {2: [1]}, {3: [5, 2, 6]}, {4: [6, 15]}]

解释

在上面的程序中,我们为 List_items 中的每个子列表创建字典。这里索引 (idx) 充当键,子列表充当值。我们将结果字典存储在 replaced_ordinal_list 中。

方法 5. 使用列表推导式结合索引。

在这种方法中,我们将查看当我们希望将一个子列表表示为索引 0,并将下一个子列表表示为前一个子列表的索引增量时,如何有效地做到这一点。

示例

import numpy as np

List_items= [[6, 8, 12, 15], [2, 5, 13,], [1], [5, 2, 6], [6, 15]]
replaced_ordinal_list = [[idx] for idx, sublist in enumerate(List_items) for _ in sublist]
print(replaced_ordinal_list)

输出

[[0], [0], [0], [0], [1], [1], [1], [2], [3], [3], [3], [4], [4]]

解释

在上面的程序中,我们使用带有嵌套循环的列表推导式。外部循环迭代 List_items 中的每个子列表,内部循环重复子列表中每个元素的索引。

方法 6:使用递归

示例

def replace_ordinal_fun(List_items, ind=0):
   if not List_items:
      return []
   return [ind] * len(List_items[0]) + replace_ordinal_fun(List_items[1:], ind+1)

List_items= [[6, 8, 12, 15], [2, 5, 13,], [1], [5, 2, 6], [6, 15]]
replaced_ordinal_list = replace_ordinal_fun(List_items)
print(replaced_ordinal_list)

输出

[0, 0, 0, 0, 1, 1, 1, 2, 3, 3, 3, 4, 4]

解释

在上面的程序中,我们使用了递归函数 replace_ordinal_fun 来用其序号替换列表元素。这里递归函数将输入参数作为项目列表和从 0 开始的索引。在每次递归中,它获取子列表并为该列表构建序数,然后在下一次递归调用中,它获取另一个子列表并再次为该列表构建序数。当输入列表为空时,它将返回,这作为递归函数的基本情况。

方法 7:使用生成器表达式。

示例

import numpy as np

List_items= [[6, 8, 12, 15], [2, 5, 13,], [1], [5, 2, 6], [6, 15]]
replaced_ordinal_list = list([idx] * len(sublist) for idx, sublist in enumerate(List_items))
print(replaced_ordinal_list)

输出

[[0, 0, 0, 0], [1, 1, 1], [2], [3, 3, 3], [4, 4]]

解释

在上面的程序中,我们在列表构造器内部使用了生成器表达式,用于通过将索引乘以每个子列表的长度来生成列表。生成表达式后,我们将结果生成器表达式转换为名为 replaced_ordinal_list 的列表。

因此,我们了解了多种方法,可以使用这些方法用其序号替换列表元素。每种方法都有其自己的方法来查找序数。您可以选择适合您需求的方法,但了解各种方法对于学习来说是件好事。

更新于: 2023年10月3日

172 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告