python-3.x 我需要从列表中的每个数字中减去1,有简单的方法吗?

ovfsdjhp  于 2022-11-26  发布在  Python
关注(0)|答案(3)|浏览(433)

这是我的名单:

list_input = [432567,876323,124356]

这是我需要的输出:

List_output = [321456,765212,013245]

像这样,

for index, number in  enumerate(list_input):
           one_number = list_lnput(index)
           one_digit_list = list(one_number[0])

这一步之后我就没主意了

cqoc49vn

cqoc49vn1#

这个问题的时间复杂度为 O(1),因为你需要从整数i中减去一个1的个数,这个个数等于这个整数的位数,可以通过计算int(math.log10(i)) + 1得到,用(10 ** (int(math.log10(i)) + 1) - 1) // 9可以得到相同个数的1:

import math

def decrement_digits(i):
    return i - (10 ** (int(math.log10(i)) + 1) - 1) // 9

因此,例如decrement_digits(432567)将返回:

321456

因此您可以将输入列表Map到函数以进行输出:

List_output = list(map(decrement_digits, list_input))
dced5bon

dced5bon2#

divmod可以用来依次分离每个数字。记住小数点的位置(1、10、100等),以便正确地将其加回。对于零,这会很混乱。但我们没有任何定义在这种情况下应该发生什么,所以我坚持使用它。
把逻辑放在它自己的函数中使得把过程写成列表理解更容易。我认为它也比试图维护索引更容易阅读。

def digit_subtract(num):
    result = 0
    base = 1
    while num:
        num, remain = divmod(num, 10)
        result += (remain-1) * base
        base *= 10
    return result

list_input = [432567,876323,124356]
List_output = [321456,765212,13245]

test = [digit_subtract(num) for num in list_input]
print(test)
assert test == List_output
vybvopom

vybvopom3#

要获得带前导零的输出,唯一的方法是将intS转换为strS。

list_input = [432567,876323,124356]
list_output = [''.join(str(int(digit)-1) for digit in str(s)) 
               for s in list_input]

请注意,这将导致输入负数时出现ValueError:

list_input = [-4306]
list_output = [''.join(str(int(digit)-1) for digit in str(s)) 
               for s in list_input]
print(list_output)

Traceback (most recent call last):
  File "/Users/michael.ruth/SO/solution.py", line 2, in <module>
    list_output = [''.join(str(int(digit)-1) for digit in str(s))
  File "/Users/michael.ruth/SO/solution.py", line 2, in <listcomp>
    list_output = [''.join(str(int(digit)-1) for digit in str(s))
  File "/Users/michael.ruth/SO/solution.py", line 2, in <genexpr>
    list_output = [''.join(str(int(digit)-1) for digit in str(s))
ValueError: invalid literal for int() with base 10: '-'

相关问题