遍历列表并用索引替换值

sna*_*che 2 python

我有一个列表,它是一个字符串的结果.split

例如,字符串numbers = "1/2//4//6"

>>> numbers = numbers.split("/")
['1', '2', '', '4', '', '5']
Run Code Online (Sandbox Code Playgroud)

我想基于该列表创建一个列表,在该列表中,任何空值(即'')都将替换为仅以空值递增的数字。因此,最终结果应为:

[1, 2, 1, 4, 2, 6]
Run Code Online (Sandbox Code Playgroud)

第一个空值已替换为1,第二个空值已替换为2

我创建了一个可以做到这一点的循环,但是坦率地说,这很麻烦,让我回到了Java:

auto = 1
for i,number in enumerate(numbers):
    if number == "":
        numbers[i] = auto
        auto += 1
    else:
        numbers[i] = int(number)
Run Code Online (Sandbox Code Playgroud)

我希望能够在不使用外部变量的情况下执行此操作,并且理想情况下,可以通过列表理解来实现。

这在Python中可行吗?

Aja*_*234 11

您可以使用itertools.count

import itertools
c = itertools.count(1)
numbers =  "1/2//4//6"
result = [int(i) if i else next(c) for i in numbers.split('/')]
Run Code Online (Sandbox Code Playgroud)

输出:

[1, 2, 1, 4, 2, 6]
Run Code Online (Sandbox Code Playgroud)

编辑:如果您希望避免与增量过程相关的“外部”变量,并且如果您愿意存储数字的拆分结果,则可以使用enumerate。但是,它不如使用效率高或不够干净itertools.count

numbers = "1/2//4//6".split('/')
result = [int(a) if a else sum(not c for c in numbers[:i])+1 for i, a in enumerate(numbers)]
Run Code Online (Sandbox Code Playgroud)

输出:

[1, 2, 1, 4, 2, 6]
Run Code Online (Sandbox Code Playgroud)