【问题标题】:how to check if 3 characters are in consecutive alpha order如何检查3个字符是否按连续的字母顺序
【发布时间】:2012-04-21 06:43:34
【问题描述】:

只是好奇,什么是最pythonic/最有效的方法来确定是否 3个字符的序列是连续的字母顺序吗?

在看似可行的快速而肮脏的方式之下,还有其他更好的实现方式吗?

我想另一种方法可能是对副本进行排序 排序并与原件进行比较。不,那不考虑 对于序列中的间隙。

(这不是家庭作业 - NPR Sunday Morning 节目的听众会 知道)

def checkSequence(n1, n2, n3):
    """ check for consecutive sequence of 3 """
    s = ord('a')
    e = ord('z')

#   print n1, n2, n3
    for i in range(s, e+1):
        if ((n1+1) == n2) and ((n2+1) == n3):
           return True

    return False


def compareSlice(letters):
    """ grab 3 letters and sent for comparison """

    letters = letters.lower()
    if checkSequence(ord(letters[0]), ord(letters[1]), ord(letters[2])):
        print '==> seq: %s' % letters
        return True

    return False

【问题讨论】:

  • 这是reason吗?
  • 看来下一步是要检查字典。试试this

标签: python sequence alphabetical


【解决方案1】:

简单:

>>> letters = "Cde"
>>> from string import ascii_lowercase
>>> letters.lower() in ascii_lowercase
True
>>> letters = "Abg"
>>> letters.lower() in ascii_lowercase
False  

或者,可以使用string.find()

>>> letters = "lmn"
>>> ascii_lowercase.find(letters) != -1
True

我猜一个使用这个的函数看起来像:

def checkSequence(*letters):
    return ''.join(letters).lower() in ascii_lowercase

【讨论】:

  • 这在我看来是最前卫最简单的解决方案,非常好。
【解决方案2】:

这可以简单地做到

>>> x=['a','b','c']
>>> y=['a','c','b']
>>> z=['c','b','a']
>>> x==sorted(x) or x == sorted(x,reverse=True)
True
>>> y==sorted(x) or y == sorted(y,reverse=True)
False
>>> z==sorted(x) or z == sorted(z,reverse=True)
True
>>> 

这样想。如果字母按升序或降序排序,则字母是连续的。

正如评论中指出的那样,如果序列包含孔,这将不起作用,另一种方法是

>>> ''.join(x).lower() in string.lowercase
True
>>> 

【讨论】:

  • 问题中已经提到了这种方法,正如 OP 指出的那样,它不起作用。
  • @MarkByers:我已经用另一种可能的解决方案更新了我的答案
  • 仍然是错误的。 aceTrue。你应该使用// 而不是/。如果没有该更改,您的代码将在 Python 3 中出错。
  • OK +1 努力,虽然我仍然认为你的答案有一半是错误的。
  • +1 表示第二种解决方案,看起来又好又干净。您可能应该将其移至答案的顶部,而不是先留下不正确的答案。
【解决方案3】:

这是一个很好的 Python 方法来检查任意长的字符序列:

def consecutive_chars(l):
    return all(ord(l[i+1])-ord(l[i]) == 1 for i in range(len(l)-1))

【讨论】:

  • 编辑删除方括号以使 all 迭代生成器,而不是首先创建 Trues 和 Falses 的整个列表。
  • 整洁 .. 出于某种原因,我之前没有遇到过内置的 all() 函数
【解决方案4】:
ord('a') < ord(a)+1 == ord(b) == ord(c)-1 < ord('z')

【讨论】:

  • +1 非常有趣!这里唯一的答案是正确的。所有其他人都错过了字母检查。
  • @MarkByers 是的 =) ,虽然这里的解决方案空间有限,直接搜索更容易
【解决方案5】:

这样的事情怎么样:

l = letters.lower()
if len(l)>=3 and ord(l[0])+2==ord(l[1])+1==ord(l[2]): print "yes"
else: print "no"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多