Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查1后面是否始终跟有0_Python_Python 3.x_List_Binary - Fatal编程技术网

Python 如何检查1后面是否始终跟有0

Python 如何检查1后面是否始终跟有0,python,python-3.x,list,binary,Python,Python 3.x,List,Binary,在Python中,我找不到一个解决方案,即如何确定在数字列表的某个地方是否总是有一个0跟在一个1后面,从而形成一对10。它不必是直接的跟随者 为了清楚起见,我的意思是“列表”,具体地说是二进制数 1100 #pass 1001 #fail 1010 #pass 0101 #fail 11110000 #pass 11100001 #fail 11100100 #pass 0E之前必须始终有相等数量的1E。 提前感谢。重新导入 cases = ['0111', '1100','

Python中,我找不到一个解决方案,即如何确定在数字列表的某个地方是否总是有一个0跟在一个1后面,从而形成一对10。它不必是直接的跟随者

为了清楚起见,我的意思是“列表”,具体地说是二进制数

1100  #pass
1001  #fail
1010  #pass
0101  #fail

11110000  #pass
11100001  #fail

11100100  #pass
0E之前必须始终有相等数量的1E。 提前感谢。

重新导入
cases = ['0111', '1100','1001','1010','0101','11110000','11100001','11100100', '11100000', '11000110']

def check(s):
    cnt_0, cnt_1 = sum(ch == '0' for ch in s), sum(ch == '1' for ch in s)
    if cnt_0 != cnt_1:
        return False
    i1 = (v[0] for v in enumerate(s) if v[1] == '1')
    i2 = (v[0] for v in enumerate(s) if v[1] == '0')
    for idx1, idx2 in zip(i1, i2):
        if (idx2 < idx1):
            return False
    return True

for case in cases:
    print(case, check(case))
def良好(n): n=n[2:] 长度=0 如果重新搜索(r'.*1+$,n): 返回False; 对于枚举(n)中的i,b: 如果b==“1”: 长度+=1 其他: 如果len(n)-i<长度: 返回错误 其他: 如果长度!=0: 如果n[i:i+长度]!='0'*长度: 返回错误 长度=0 返回真值 打印((良好('1B1110001')) 印刷品((良好('1B11000000')) 打印((良好('1b1100')) 打印((良好('1b1101')) 打印((良好('1b1010')) 打印((良好('1b0101')) 打印((良好('1b0111'))
我的解决方案只是使用嵌套for循环。无需导入模块:)

1-用于测试列表中每个数字的外部for循环

2-内for循环用于使用外循环中的数字测试列表中的其他数字

binary = list("0100")
result = "Fail"


for idxNumber, number in enumerate(binary):
    for idxOtherNumbers, otherNumbers in enumerate(binary):
        if int(number) == 1:
            if int(otherNumbers) == 0 and idxOtherNumbers > idxNumber:
                result = "Pass"
            elif int(otherNumbers) == 1 and idxOtherNumbers > idxNumber:
                result = "Fail"
print(result)

保留一个临时变量,初始化为
0
。为每个
1
递增,否则递减。 它永远不应该是负数,为了确保
1
0
一样多,它应该在末尾等于
0

def check(bits):
    temp = 0
    for bit in bits:
        if temp < 0:
            return False
        if int(bit) == 1:
            temp += 1
        else:
            temp -= 1
    return temp == 0

这里是一个NumPy方法,附带了一个实用函数,用于将字符串转换为数组

将numpy导入为np
def nums_str_to_ndarr(str_in:str)->np.ndarray:
返回np.fromiter(str_-in,dtype=int,count=len(str_-in))
def valid_ones_arr(nums_arr:np.ndarray)->bool:
nums\u arr[nums\u arr==0]=-1
nums\u arr=np.cumsum(nums\u arr)
返回np.all(nums\u arr>=0)和(nums\u arr[-1]=0)


我将使用它作为基准/标准,同时寻找更好的解决方案。当然,欢迎大家也这样做:)

您尝试过什么?你能分享吗?试着想想这个设置背后的逻辑。尝试一下。到目前为止你试过什么了吗?你是什么意思?在第一种情况下,1后面不总是跟0。只有第二种情况才能通过筛选。如果s中的“10”或bin中的“10”,那么
如何呢?
我提出的唯一合理的解决方案是从开始和结束比较值,直到出现1和0的匹配,然后从列表中删除这两个值并重复。不过,这在许多其他情况下都不起作用。例如,对于11100100,应该返回True,但它不返回Truet@igor为什么
11100100
返回
True
?最后只有一个
1
,后面是两个
00
…因为如果你把它分解,你会得到11100100,11100100,11100100,最后11100100现在11100000通过了,即使它不应该通过:D我只是不能绕着它转,它看起来很容易,但我不能想出任何功能性的东西。。。尽管可以放弃,但无论如何,这就像一场噩梦,因为某些原因,只剩下11000110个了。为什么所有的强制转换都使用
int()
?为什么要将该字符串转换为列表?您的
continue
语句似乎没有必要。使用int()是因为list(“0100”)以字符串格式创建数字列表。感谢您指出继续声明。我修正了代码。是的,我的观点是没有理由想要整数列表而不是字符串。你的程序根本没有利用它们是整数的事实。@AlexanderCécile转换为整数的优点是代码现在接受一个字符串或整数列表。@EricDuminil我没有想到,我想这是一个不错的奖励。命名函数
len
是个坏主意。你为什么要做
n.\uu len\uu()
?@EricDuminil-Tbh我以为我做了一些更改,但我可能正在考虑另一个没有成功的函数。对不起,D:顺便问一下,你是怎么知道的?@AlexanderCécile:我已经编程30年了D但大多数情况下,它看起来像是确定括号和方括号是否为:
{({})[(())}
的一个简单版本。为此,您需要一个堆栈,但由于只有一种类型的“括号”,您只需要知道堆栈是否为空。因此,您可以用一个简单的计数器替换堆栈。
binary = list("0100")
result = "Fail"


for idxNumber, number in enumerate(binary):
    for idxOtherNumbers, otherNumbers in enumerate(binary):
        if int(number) == 1:
            if int(otherNumbers) == 0 and idxOtherNumbers > idxNumber:
                result = "Pass"
            elif int(otherNumbers) == 1 and idxOtherNumbers > idxNumber:
                result = "Fail"
print(result)
def check(bits):
    temp = 0
    for bit in bits:
        if temp < 0:
            return False
        if int(bit) == 1:
            temp += 1
        else:
            temp -= 1
    return temp == 0
>>> check('1100')
True
>>> check('110001')
False
>>> check('1')
False
>>> check('10')
True
>>> check('1010')
True
>>> check('123')
False