0

可能重复:
检查字符串的字符是否按字母顺序升序,其升序是否均匀分布 python

这是我目前拥有的:

wordlist = ['fox', 'aced', 'definite', 'ace']

for word in wordlist:
    a = len(word)
    if (ord(word[a-(a-1)] - ord(word[(a-a)])) == ord(word[a-(a-2)])-ord(word[a-(a-1)]:
        print "success", word
    else:
        print "fail", word

我要做的是计算单词中每个字母之间的 ASCII 值。并检查字母的顺序是否增加了相同的值。

所以对于狐狸来说,它会检查第 2 个和第 1 个字母的序数之差是否等于第 3 个和第 2 个字母的序数之差。

但是,在我当前的“if”语句中,只比较一个单词的前 3 个字母。如何重写此语句以涵盖长度大于 3 的单词中的每个字母?

抱歉,如果我不能清楚地介绍这一点,谢谢您的时间。

4

6 回答 6

1

考虑

import operator

def diff(s):
    return map(operator.sub, s[1:], s[:-1])

wordlist = ['fox', 'aced', 'definite', 'ace']
print [w for w in wordlist if len(set(diff(map(ord, w)))) == 1]

## ['fox', 'ace']

后一个表达式分解为:

w = 'fox'
print map(ord, w) # [102, 111, 120]
print diff(map(ord, w)) # [9, 9]
print set(diff(map(ord, w))) # set([9])
print len(set(diff(map(ord, w)))) # 1
于 2012-04-15T12:01:44.977 回答
1

注意使用len(set(...)) < 2

def check(word):
    return len(set(ord(a) - ord(b) for a,b in zip(word,word[1:]))) < 2

wordlist = ['fox', 'aced', 'definite', 'ace']
print filter(check, wordlist)

印刷:

['fox', 'ace']
于 2012-04-15T11:20:07.060 回答
0

尝试这个:

wordlist = ['fox', 'aced', 'definite', 'ace', 'x']

for word in wordlist:
    if len(word) < 2:
        print "fail", word
        continue
    diff = ord(word[1]) - ord(word[0])
    if all(ord(word[i+1])-ord(word[i])==diff for i in xrange(1, len(word)-1)):
        print "success", word
    else:
        print "fail", word

请注意,此解决方案是有效的,因为它不会生成任何中间列表或单词切片,并且内部的处理all()是通过迭代器完成的,也是all()“短路”:它将在False找到的第一个处终止。

于 2012-04-15T04:45:00.470 回答
0

我相信您正在寻找单词中每个字母之间的 ord 差异是相同的。

def check(word):
    return all((ord(ele_1) - ord(ele_2)) == (ord(word[0]) - ord(word[1])) for ele_1,ele_2 in zip(word,word[1:]) )

结果:

>>> check('abcde')
True
>>> check('wdjhrd')
False

申请您​​的名单:

wordlist = ['fox', 'aced', 'definite', 'ace']

new_list = filter(check, wordlist)

结果:

>>> new_list
['fox', 'ace']
于 2012-04-15T04:57:36.407 回答
0

这是我的表单,我觉得它更具可读性并且可扩展为列表理解。

>>> a = 'ace'
>>> all(ord(a[n])-ord(a[n-1]) == (ord(a[1])-ord(a[0])) for n in xrange(len(a)-1,0,-1))
True

并遍历单词列表,列表理解:

wordlist = ['fox', 'aced', 'definite', 'ace']
[a for a in wordlist if all(ord(a[n])-ord(a[n-1]) == (ord(a[1])-ord(a[0])) for n in xrange(len(a) -1,0,-1))]

回报:

['fox', 'ace']
于 2012-04-15T05:16:29.890 回答
-2

也许尝试更改ord(word[a-(a-2)])ord(word[a-(a-len((word)-1))]). 我不确定这是否是您的确切代码,但它似乎也是一些 EOF 错误。

于 2012-04-15T04:40:08.230 回答