Python字符串迭代

时间:2014-07-07 12:18:13

标签: python string

我遇到了困难,需要检查一下像是' 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'?

3 个答案:

答案 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