我遇到了困难,需要检查一下像是' 3456'或类似' 5678'像梯子一样。 例如:1234 - 阶梯
3476 - 不是阶梯;
我的代码:
def is_ladder(block):
for i in range(len(block)-1):
if ( ord(block[i]) == ord(block[i+1])+1):
return True
return False
如何实现?如果可能的话,如何检查字符串中的每个字符是否相同,例如' aaaa'或者' 5555'?
答案 0 :(得分:0)
根据新要求,在此处:
def is_ladder(block):
step = ord(block[0])-ord(block[1])
if step not in (-1,1):
return False
return all([ord(block[i])-ord(block[i+1])==step for i in xrange(len(block)-1)])
还可以检查每个字符是否与以下字符相同:
block.count(block[0]) == len(block)
答案 1 :(得分:0)
首次转换为数字列表后,检查上下排序。成对迭代从https://docs.python.org/2/library/itertools.html#recipes解除。
from itertools import tee, izip
def pair(series):
a, b = tee(series)
next(b, None)
return izip(a, b)
def is_ladder(block):
block_digits = [ord(c) for c in block]
return (
all(c + 1 == d for c, d in pair(block_digits)) or
all(c - 1 == d for c, d in pair(block_digits))
)
结果:
>>> print is_ladder('1234')
True
>>> print is_ladder('4321')
True
稍后:这是您修改过的问题的解决方案(梯子是所有字母/数字都相同)。
def is_ladder(block):
block_digits = [ord(c) for c in block]
return (
all(c + 1 == d for c, d in pair(block_digits)) or
all(c - 1 == d for c, d in pair(block_digits)) or
len(set(block_digits)) == 1
)
后来还是。如果不出意外,了解成对迭代习语很有用。以下是它的产生:
>>> for i, j in pair(range(5)):
... print i, j
...
0 1
1 2
2 3
3 4
它将您的序列分成多对连续元素。当第二个序列(由next(b, None)
提前一个位置)为空时,迭代终止。
答案 2 :(得分:0)
def seq(s):
if all(s[0]==x for x in s[1:]):
return True
elif ord(s[0]) > ord(s[1]):
s = s[::-1]
first = ord(s[0])
for i in s[1:]:
if ord(i) != first + 1:
return False
else:
first = ord(i)
return True
In [19]: seq("aaaa")
Out[19]: True
In [20]: seq("4321")
Out[20]: True
In [21]: seq("1230")
Out[21]: False
In [22]: seq("edcb")
Out[22]: True