【问题标题】:Check if numbers in a comma-separated string are odd or even检查逗号分隔字符串中的数字是奇数还是偶数
【发布时间】:2020-03-19 12:53:05
【问题描述】:

我需要编写一个程序来检查逗号分隔字符串上的每个数字是偶数还是奇数。

我必须使用for 循环来完成,我的代码是这样的:

getallen = '12, 3, 7, 25, 771, 45, 6, 98, 55, 546'

for number in getallen:
    if number %2 == 0:
        print(f'{int(number)} is even')
    else:
        print(f'{int(number)} is odd')

输出应该是这样的:

12 is even
3 is odd
7 is odd etc etc.

【问题讨论】:

    标签: python string for-loop


    【解决方案1】:

    Matt 是正确的,您正在迭代一个字符串,而不是一个数组,但是在拆分之后,您还需要将每个值转换为一个数字。有几种方法可以做到这一点:

    您可以使用map 将数组的每一项转换为使用int 的数字:

    for number in map(int, getallen.split(',')):
        if number %2 == 0:
            print(f'{int(number)} is even')
        else:
            print(f'{int(number)} is odd')
    

    或者您可以在测试时转换每个数字:

    for number in getallen.split(','):
        if int(number) %2 == 0:
            print(f'{int(number)} is even')
        else:
            print(f'{int(number)} is odd')
    

    这两个都会产生:

    12 is even
    3 is odd
    7 is odd
    25 is odd
    771 is odd
    45 is odd
    6 is even
    98 is even
    55 is odd
    546 is even
    

    【讨论】:

      【解决方案2】:

      您的代码不起作用,因为getallen 是一个字符串,而不是一个数组。你需要先用getallen = getallen.split(',')将它转换成数组

      【讨论】:

        【解决方案3】:

        您的字符串是一个元组文字,因此您可以使用ast.literal_eval 将其安全地转换为整数元组。这可以直接在您的for 循环中使用。

        import ast
        getallen = '12, 3, 7, 25, 771, 45, 6, 98, 55, 546'
        
        for number in ast.literal_eval(getallen):
            if number %2 == 0:
                print(f'{int(number)} is even')
            else:
                print(f'{int(number)} is odd')
        

        【讨论】:

        • 使用 Python AST 将此代码编译为 Python 元组似乎有点矫枉过正。 FWIW 我认为这也是安全的,但文档警告说,由于 Python 的 AST 编译器中的堆栈深度限制,甚至有可能使用足够大/复杂的字符串使 Python 解释器崩溃......
        • 构造一个大到足以超过 Python 的 C 堆栈的元组文字留给读者作为练习。
        • 我只是说你需要小心不要自动假设这种方法在类似情况下是安全的。如果有人控制了提供的字符串,恶意攻击者可能会将“练习”视为有趣的挑战。
        • 对我来说,这足以让它崩溃:'[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]'
        • @Elijan9 我认为你已经表明你认为ast.literal_eval 已经过分了。我不会反对它以计算开销为代价来购买使用简单。但是,我不知道您还想指出什么。 “您希望输入是整数值,用 ',' 分割”对于ast.literal_eval 来说也是一个非常好的情况。请注意,ast.literal_eval 安全并不意味着 map(int, ...) 不安全。
        猜你喜欢
        • 2011-11-12
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多