【问题标题】:How to check if a variable is binary in Python如何在 Python 中检查变量是否为二进制
【发布时间】:2022-11-23 23:03:06
【问题描述】:

为了检查给定的 list 是否仅由 01 值构成,我尝试设置一个函数,当 list 是二进制时返回 True,而当它不是时返回 False :

我的代码

def is_binary(y):
    for x in y:
        if x in [2,3,4,5,6,7,8,9]:
            return False
            break
        else:
            return True

我在以下列表中尝试过:

our_list=[1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,1,1]
is_binary(our_list)

输出:

True

但是当变量不是二进制时它不起作用。 您身边的任何帮助将不胜感激。

【问题讨论】:

  • 不管这个数字是多少,你都会返回第一个数字。您永远不会检查第一个数字之后的任何内容。将 return True 移到 for 循环之外。另外,检查x not in [0, 1] 是否更直观和清晰?
  • 你可以全部使用:all(x in {0,1} for x in our_list)
  • 对于 listints 以​​外的其他情况,做 not in [0, 1] 之类的事情可能会更好。
  • 你可以简单地return all(x in [0,1] for x in y)
  • set(our_list) <= {0, 1}

标签: python


【解决方案1】:
def is_binary(arr):
    for num in arr:
        if num not in [0, 1]:
            return False
    return True
    
our_list=[1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,1,1]
print(is_binary(our_list))

我在你的代码中发现了几个错误。

首先,您的代码在执行 return 语句时停止。所以你的循环只会执行一次并返回列表中第一个元素的结果。

其次,有两个二进制数,还有无数非二进制数。您只是在检查数字是否在范围 (2, 10) 内。当数字不在该范围内时,以11为例,因为它不在范围(2, 10)内,所以不会执行return False语句。

因此,与其检查数字是否在无数非二进制数中,不如检查数字是否不是二进制数。

【讨论】:

  • 谢谢@Yeyang,你的答案有效,但我想要一个简短的解决方案
【解决方案2】:

您还可以使用列表理解来检查每个元素是否为二进制的结果,并使用 all 检查所有元素是否为真。

our_list=[1,0,0,0,1,1,0,2,0,0,1,0,1,0,1,1,1]

all([i in [0,1] for i in our_list])

False

您还可以通过添加列表理解的值并检查它是否与长度匹配来解决它,这意味着所有元素都必须为真,但它不像使用 all 那样 pythonic。

sum([i in [0,1] for i in our_list]) == len(our_list)

False

【讨论】:

  • Numpy 在那里完全没有意义,因为内置的 all 做完全相同的工作。
  • 啊,我不知道 python 有内置的 all,我一直使用 numpy 的,谢谢
【解决方案3】:

我会扭转你的逻辑。

def is_binary(y):
    for x in y:
        if x not in [0,1]:
             return False
    return True

问题的根源在于您在第一轮迭代中返回结果,因为 return 语句停止了函数的执行。这也使您的 break 语句变得多余。有关详细信息,请参阅https://www.geeksforgeeks.org/python-return-statement/

有两种用例,您的原始解决方案按预期工作,即列表长度为 1 或错误在列表的第一项中 y 并且“错误”值在列表中 [0,1, ...9] 例如y=[0]y=[1]y=[1,0]返回Truey=[3]将返回False。但是,如果 y=['three']y=[13]y=[0, 0, 3],您的解决方案将失败,因为它返回 True,尽管它应该是 False

【讨论】:

  • break 命令不是根本原因。根本原因是 if-else 语句。
  • 是的,这实际上是我的答案格式错误。我想指出问题的根源是结束执行@GodWin 的返回语句。我会编辑它。
  • 更新了答案
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2018-07-03
  • 2011-03-06
  • 2018-05-01
相关资源
最近更新 更多