Python练习:将数字转换为相反的数字数组

题目

给定一个随机非负数,你必须按相反顺序返回数组中该数字的位数。

示例(输入 => 输出):

35231 => [1,3,2,5,3]
0 => [0]

代码

def digitize(n):
    my_list = []
    for x in str(n):
        my_list.append(int(x))
    my_list.reverse()
    return my_list

def digitize(n):
    return [int(x) for x in str(n)[::-1]]

知识点:

  1. 在第一个函数中,你首先创建了一个空列表 my_list。然后,你将输入的整数 n 转换为字符串,并遍历每个字符。对于每个字符,你将其转换为整数,然后将其添加到 my_list 中。最后,你使用 list.reverse() 方法对列表进行就地反转,并返回结果。

  2. 在第二个函数中,你使用了一种 Python 的特性,称为列表推导式(list comprehension)。列表推导式是一种简洁的创建列表的方法。在这个例子中,你首先将输入的整数 n 转换为字符串,然后使用切片操作 [::-1] 将字符串反转。然后你遍历反转后的字符串的每个字符,将每个字符转换为整数,并在一个新的列表中返回结果。

  • 错误代码

    • 'int' object is not iterable

      def digitize(n):
          my_list = []
          for x in n:
              my_list.append(x)
          return my_list.reverse()
      
      print(digitize(123))  # TypeError: 'int' object is not iterable
    • 就地操作问题

      def digitize(n):
          my_list = []
          for x in str(n):
              my_list.append(x)
          return my_list.reverse()
      
      print(digitize(123))  # None

      因为 list.reverse() 是一个就地操作,它直接修改了原列表并返回 None。你应该先反转列表,然后再返回。

      此外,你的函数应该返回数字列表,而不是字符列表。你需要在 append 时将字符转换为数字。

      下面是修改后的代码:

      def digitize(n):
          my_list = []
          for x in str(n):
              my_list.append(int(x))
          my_list.reverse()
          return my_list
      
      print(digitize(123))  # 输出: [3, 2, 1]

      这段代码会将数字转换为字符串,然后将每个字符转换为数字并添加到列表中,然后反转列表并返回。

      • 深入理解代码

        我不理解:

        1. 为什么我的代码return my_list.reverse() 返回了 None

        2. list.reverse() 是一个就地操作,就地操作什么意思

        解释说明:

        1. 在Python中,list.reverse() 是一个就地操作,也就是说它会直接修改原列表并返回 None。当你尝试返回 my_list.reverse() 的结果时,你实际上是在返回 None,因为 list.reverse() 操作完毕后没有返回任何值,只是直接修改了原列表。

        2. "就地操作"是一个编程术语,意思是操作直接修改数据,而不是创建新的修改后的数据副本。在这种情况下,list.reverse() 就是一个就地操作,因为它直接在原列表上进行操作,而不是创建一个新的反转后的列表。这与一些其他的Python操作不同,例如切片操作,切片操作会返回一个新的列表,而不会修改原列表。

        例如:

        list1 = [1, 2, 3]
        list2 = list1.reverse()
        print(list1)  # 输出:[3, 2, 1]
        print(list2)  # 输出:None

        在这段代码中,list1.reverse() 直接修改了 list1,而 list2 是 None,因为 list.reverse() 没有返回任何值。

        相比之下,切片操作会返回一个新的列表:

        list1 = [1, 2, 3]
        list2 = list1[::-1]
        print(list1)  # 输出:[1, 2, 3]
        print(list2)  # 输出:[3, 2, 1]

        在这段代码中,list1 没有被修改,而 list2 是 list1 的一个反转后的副本。

测试

import codewars_test as test
from solution import digitize

@test.describe("Fixed Tests")
def basic_tests():
    @test.it('Basic Test Cases')
    def basic_test_cases():
        test.assert_equals(digitize(35231),[1,3,2,5,3])
        test.assert_equals(digitize(0),[0])
        test.assert_equals(digitize(23582357),[7,5,3,2,8,5,3,2])
        test.assert_equals(digitize(984764738),[8,3,7,4,6,7,4,8,9])
        test.assert_equals(digitize(45762893920),[0,2,9,3,9,8,2,6,7,5,4])
        test.assert_equals(digitize(548702838394),[4,9,3,8,3,8,2,0,7,8,4,5])

@test.describe("Random Tests")
def random_tests():
    
    from random import randint
    
    sol = lambda n: list(map(int, str(n)[::-1]))
    
    for x in range(100): 
        num = randint(10, 99 * 2 ** x)
        @test.it(f"Testing for digitize({num})")
        def test_case():
            test.assert_equals(digitize(num), sol(num), "It should work for random inputs too")

文章作者: waino
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 VLLLO.COM
技术分享 Python coding
喜欢就支持一下吧