微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以相反的顺序替换列表项并跳过所有其他项 python 编辑

如何解决以相反的顺序替换列表项并跳过所有其他项 python 编辑

我正在编写一个程序来使用 Luhn 算法检查卡号是否可能有效。

num = "79927398713" #example num

digits = [int(x) for x in num]

reverse = digits[1:][::2][::-1] #step 1: start from rightmost digit,skip first,skip every other
count = 0
digitsum = 0
print(reverse) #output here is: [1,8,3,2,9]

for x in (reverse):
    reverse[count] *= 2
    if reverse[count] > 9:
        for x in str(reverse[count]):  #multiply each digit in step 1 by 2,if > 9,add digits to make single-digit number
            digitsum += int(x)
        reverse[count] = digitsum
    count += 1
    digitsum = 0
count = 0
print(reverse) #output here is [2,7,6,4,9]

基本上,我想将 [2,9] 输入回列表 digits 中的相应位置。它看起来像这样(改变星号中的数字)

[7,**9**,9,**4**,**6**,**7**,**2**,3]

问题是,我必须向后读取 digits,跳过第一个(技术上是最后一个)元素,然后从那里跳过所有其他元素,每次都替换值。

我是不是用错了方法/让自己太难了?或者有没有办法向后索引,跳过第一个(技术上是最后一个)元素,然后跳过所有其他元素?

解决方法

您可以通过简单的索引来做到这一点

获得变量 reverse 后,您可以在左侧索引:

# reversed is [2,7,6,4,9] here
digits[1::2] = reversed(reverse) # will place 9,2 in your example

注意,您也可以在初始化反向的行中使用此技巧

reverse = digits[1::2][::-1]

我认为你甚至可以使用:

reverse = digits[-1 - len(digits) % 2::-2]

应该更有效率

编辑

在大小为 10,000 的数组上运行 timeitdigits[-1 - len(digits) % 2::-2] 的最后一个解决方案比原始解决方案快 3.6 倍,我强烈建议使用它

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。