给定一个字符串,让我们说" 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语言的全新。
答案 0 :(得分:2)
import operator
def num_diffs(state):
return sum(map(operator.ne, state, state[1:]))
要稍微打开它,它会从!=
开始,operator.ne
,state
,从第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()
功能的工作原理是将相同的条目组合在一起。它返回key
和group
,密钥是匹配的单个条目,组是匹配条目的列表。所以每次它返回时,它都会告诉你存在差异。
答案 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的答案。