我刚开始接受我的第一堂课并且我目前做得非常好,但是这个问题让我很伤心,我会帮助我获得任何帮助。
问题:
序列中的反转是一对乱序的条目。例如,字符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)
我无法用我的代码到达那里。
答案 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