计算字符串中的反转

时间:2013-05-17 16:41:44

标签: python python-3.x inversion

我刚开始接受我的第一堂课并且我目前做得非常好,但是这个问题让我很伤心,我会帮助我获得任何帮助。

问题:

序列中的反转是一对乱序的条目。例如,字符F和D在字符串'ABBFHDL'中形成反转,因为F出现在字符串中较早但稍后出现在字母表中。字符H和D也形成反转。序列中的反转总数,即无序对的数量,是序列未分类的度量。 'ABBFHDL'中的反转总数为2.实现函数反转(),它采用大写字符A到Z的序列(字符串),并返回序列中的反转次数。

到目前为止我得到的是以下内容:

    def inversions(s):
        count = 0
        for i in range(len(s)):          # for each index i
            for j in range(len(s)):      # for each index J
                if s[j]>=s[i]:           # compare string[i] and string[j]
                    count += 0

                else:
                    count +=1
                    return count

并且它在rabit洞下方的距离不够远,以获得良好的部分学分:(

这给了我一个所以这不正确(应该是2)。

我想知道的是,现在这是一个很大的障碍,是如何编写代码以实现这一点:#每个索引j大于i

我已经尝试了几个代码,但我没有让它工作,我尝试过这些:

    for j in range(len(s)>i):        # the result i get is 1
    for j in range(len(s)<i):        # the result i get is 'blank
    for j in range(len(s)>s[i]):    # the result i get is this error message : 

    for j in range(len(s)>s[i]):
    TypeError: unorderable types: int() > str()

我无法实现的是让函数迭代序列中的每个可能的对(字符串)。

(即AA,AB,AB,AF,AH,AD,AL,BB,BB,BF,BH,BD,BL,(这些都不会计数 - 但是当迭代达到F时会有一个FD的反转计数然后是HD的反转计数,因此答案2)

我无法用我的代码到达那里。

3 个答案:

答案 0 :(得分:2)

修改后的代码

这应该有效

def inversions(s):
        count = 0
        for i in range(len(s)-1):
            for j in range(i+1,len(s)):
                if s[i] > s[j]:
                    print(s[i],s[j])
                    count +=  1
                    break
#remove 'break' if you want to count every possible 
#out of order pair for a particular character in the string
        print(count)

答案 1 :(得分:1)

这是获取所有字母对的方法:

for i in range(len(s)):
    for j in range(i + 1, len(s)):
        print s[i], s[j]

我会把计数部分留给你!

答案 2 :(得分:0)

现在我提供的不是很好的代码,但它可能仍然具有教育意义。

inv = lambda w:sum([sum([w[i]>w[j] for j in range(i+1,len(w))]) for i in range(len(w))])

完全按照您指定的内容进行操作。我曾经为一次代码高尔夫挑战写过这篇文章。

你甚至可以通过使用itertools来增加它的作用:

from itertools import combinations
inv = lambda w:sum([w[i]>w[j] for i,j in combinations(range(len(w)),2)])

您可以像使用任何其他函数一样使用这些lambda函数:

In [32]: inv('ABBFHDL')
Out[32]: 2