【问题标题】:Iterate string to compare an i element to i+1 element python迭代字符串以将 i 元素与 i+1 元素进行比较 python
【发布时间】:2022-01-13 13:24:40
【问题描述】:

我有一个 DNA 序列:

seq='AACGTTCAA'

我想计算有多少个字母等于下一个。在这个例子中,我应该得到 3(因为 AA-TT-AA)。

在我第一次尝试时,我发现这不起作用,因为 i 是一个字符串,而 1 是一个整数。

seq='AACGTTCAA'
count=[]
for i in seq:
    if i == i+1: #neither i+=1
        count.append(True)
    else: count.append(False)
print(sum(count))  

所以我尝试了这个:

seq='AACGTTCAA'
count=[]
for i in seq:
    if i == seq[seq.index(i)+1]:
        count.append(True)
    else: count.append(False)
print(sum(count))  

然后我收到这个我无法理解的输出。 其中 3 个 True 应该是 False (1,5,8) 尤其是 8,因为它是字符串的最后一个元素。

6
[True, True, False, False, True, True, False, True, True] 

如果考虑用数组来做这件事,但我认为可能有一种简单的方法可以在字符串中做到这一点。谢谢

【问题讨论】:

  • 我认为你的索引调用总是返回你正在寻找的字符的第一个位置,所以这就是你看到太多 Trues (doc) 的原因。我会按照下面@bichanna 的回答中的建议进行操作
  • AAA 呢?

标签: python for-loop string-iteration


【解决方案1】:

你可以这样做:

for i in range(0, len(seq)):
   if seq[i] == seq[i+1]: # <- this causes an error
      count.append(True)

虽然你必须检查seq[i+1]是否不会导致错误。

更新

count = 0
for i in range(0, len(seq)-1): # this prevents an error
   if seq[i] == seq[i+1]:
      count += 1

【讨论】:

  • 循环应该运行到len(seq) - 1 以避免溢出。您当前的实施将引发错误
  • 是的,没错。我在回答中是这么说的。
  • 另外,将计数保留在列表中不会帮助您获得计数。
  • 这就是 OP 正在做的事情。我刚刚复制了。
  • 您应该发布没有损坏的代码,而不是说出来。如果 OP 做错了事,那么回答的重点就是纠正它们。
【解决方案2】:

使用 itertools 是一种方法:

from itertools import groupby
seq = 'AACGTTCAA'
print(sum(len(list(g))-1 for k,g in groupby(seq)))

这会将序列分成连续字母的组,然后将每个组的长度为 1 计入总数。

编辑:用 mozway 的 cmets 更新。

【讨论】:

  • 这行不通(AAAA 将计为 1 而不是 3),您必须将 len-1 相加
  • 你是对的,我没有从示例序列中意识到这种情况。更新了答案。它不再那么漂亮了,但仍然是一个不错的单线器。
  • 您只需将&gt;1 替换为-1,1 个项目的组将产生 0 ;)
  • 是的,这更漂亮,尽管可能会让某些人更加困惑。让我们做吧:)
  • 我不认为它令人困惑,只需要知道groupby 是如何工作的
【解决方案3】:

不需要的 True 的原因是因为 seq.index()

index(),总是会返回您正在搜索的字符的第一次出现。当您有 2 个连续字符时,它实际上会返回该字符第一次出现的索引,并且它们始终匹配。

这是一个快速的解决方案:

seq='AACGTTCAA'
count=[]
for i in range(0,len(seq)-1):
    print(i)
    if seq[i]==seq[i+1]:
        count.append(True)
    else: count.append(False)
print(count) 

【讨论】:

    【解决方案4】:

    为了回答您的问题,对于 i in seq 的语句会产生一系列字符串变量,例如“A”、“A”、“C”等。 因此,当您在第一种情况下尝试比较 i == i+1: 时,会将 1 添加到抛出 TypeError 的字符串变量中。 在您的第二个示例中,您执行 if i == seq[seq.index(i)+1] 会给出错误的结果,因为 seq.index(i) 总是返回该值的第一次出现。 要在基本级别上做您想做的事,您可以执行以下操作:

    def countPairedLetters(seq):
        count = 0
        for i in range(1, len(seq)):
            # i starts with 1 and ends with len(seq)-1
            if seq[i-1] == seq[i]:
                count += 1
        return count    
    

    注意:从索引 1 开始到最后,可以避免超出序列的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 2020-07-20
      相关资源
      最近更新 更多