Python 如何检查1后面是否始终跟有0
在Python中,我找不到一个解决方案,即如何确定在数字列表的某个地方是否总是有一个0跟在一个1后面,从而形成一对10。它不必是直接的跟随者 为了清楚起见,我的意思是“列表”,具体地说是二进制数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','
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