Python 3中字符串中字符之间的差异数

时间:2016-03-31 12:02:18

标签: python string python-3.x

给定一个字符串,让我们说" TATA __",我需要找到该字符串中相邻字符之间的差异总数。即T和A之间存在差异,但A和A之间没有差异,或_和_。

我的代码或多或少告诉我这个。但是当一个字符串如" TTAA __"如果给出,它没有按计划运作。

我需要在该字符串中取一个字符,并检查它旁边的字符是否不等于第一个字符。如果它确实不相等,我需要在运行计数中加1。如果相等,则不会在计数中添加任何内容。

这是我到目前为止所做的:

def num_diffs(state):
    count = 0            
    for char in state:
        if char != state[char2]:
            count += 1
    char2 += 1
    return count

当我使用num_diffs(" TATA __")运行它时,我得到4作为响应。当我用num_diffs运行它时(" TTAA __")我也得到4.而答案应该是2.

如果其中任何一个都有意义,那么任何人都可以帮助修复它/指出我的错误所在吗?我有一种感觉与状态[char2]有关。对不起,如果这看起来像一个微不足道的问题,那只是我对Python语言的全新。

4 个答案:

答案 0 :(得分:2)

import operator

def num_diffs(state):
    return sum(map(operator.ne, state, state[1:]))

要稍微打开它,它会从!=开始,operator.nestate,从第2个字符开始。 state函数接受多重迭代作为参数,并将这些元素逐个作为给定函数的位置参数传递,直到其中一个迭代用尽(在这种情况下map将先停止)。

state[1:]导致可迭代的布尔值,但由于python中的map继承自bool,因此您可以在某些上下文中将其视为此类。这里我们对int值感兴趣,因为它们代表相邻字符不同的点。在该映射上调用True显然是下一步。

除了字符串切片之外,整个事情在python3中使用迭代器运行。如果想要避免切割大字符串,也可以在字符串sum上使用迭代器:

state

答案 1 :(得分:1)

有几种方法可以做到这一点 首先,您可以使用索引遍历字符串,并将每个字符与前一个索引处的字符进行比较 其次,您可以在单独的变量中跟踪前一个字符。第二个似乎更接近你的尝试。

def num_diffs(s):
    count = 0
    prev = None
    for ch in s:
        if prev is not None and prev!=ch:
            count += 1
        prev = ch
    return count

prev是前一循环迭代中的字符。您可以在每次迭代结束时将其分配给ch(当前字符),以便在下一次迭代中可用。

答案 2 :(得分:1)

您可能想要研究Python的groupby函数,这有助于进行此类分析。

from itertools import groupby

def num_diffs(seq):
    return len(list(groupby(seq))) - 1

for test in ["TATA__",  "TTAA__"]:
    print(test, num_diffs(test))

这会显示:

TATA__ 4
TTAA__ 2

groupby()功能的工作原理是将相同的条目组合在一起。它返回keygroup,密钥是匹配的单个条目,组是匹配条目的列表。所以每次它返回时,它都会告诉你存在差异。

答案 3 :(得分:-1)

尝试对原始代码进行尽可能少的修改:

def num_diffs(state):
    count = 0            
    for char2 in range(1, len(state)):
        if state[char2 - 1] != state[char2]:
            count += 1      
    return count                    

原始代码的一个问题是char2变量未在函数体内初始化,因此无法预测函数的行为。

然而,使用索引并不是最恐怖的方式,而且容易出错(请参阅我所犯错误的评论)。您可能希望以这样的方式重写函数:它在一对字符串上进行一次循环,一次一对字符:

def num_diffs(state):
    count = 0
    for char1, char2 in zip(state[:-1], state[1:]):
        if char1 != char2:
            count += 1
    return count

最后,这个逻辑可以写得更简洁 - 请参阅@ Ilja的答案。