如何在 Python 中处理迭代

How to deal with iteracy in Python

提问人:alxn 提问时间:1/15/2023 最后编辑:mkrieger1alxn 更新时间:1/15/2023 访问量:48

问:

我有这个代码:

def PCP(seq, feature):
  l = []
  mean = st.mean(list(feature.values()))
  std = np.std(list(feature.values()))
  for elem in seq:
      for aa in elem:
          if aa in feature:
              l.append((feature[aa]-mean)/std)
          else:
              l.append(0)
  return l

seq是带有序列的字符串列表,是以氨基酸为键,以某些值为值的字典。我希望该函数通过列表()中字符串中的每个字符串,并获取字典中对应的值并进行计算。featureaaseq

这是我作为 和 dict 输入的一段数据:seqfeature

['KISKDLSIAVQMMKRIHSLLERYPEIL', 'SGRVEKSPHEQEIKFFAKILLPLINQY', 'IDQLIVFGEQLIQKSEPLDAVLIEDEL', ..], pI= {"K":9.47, "P":6.3, "R":10.76, "T":5.6, "A":6.11, "C":5.02, "D":2.98, "E":3.08, "F":5.91, "G":6.06, "H":7.64......}

也许他们有什么问题。

当我运行该函数时,我收到以下错误:

Traceback (most recent call last)
<ipython-input-13-89a7be7ecda7> in <module>
----> 1 test_hydrofobowosc= PCP(test_data_neg, hydrofobowosc)

<ipython-input-12-2f318f9cb908> in PCP(seq, feature)
     14   mean = st.mean(list(feature.values()))
     15   std = np.std(list(feature.values()))
---> 16   for elem in seq:
     17       for aa in elem:
     18           if aa in feature:

TypeError: 'NoneType' object is not iterable

怎么了?

Python 函数 循环 序列 可迭代

评论

0赞 mkrieger1 1/15/2023
什么是“迭代”?
0赞 cards 1/15/2023
添加完整的错误回溯
0赞 cards 1/15/2023
缩进很可疑,你能检查一下吗?特别是(因为该函数将执行一次迭代并退出)return
0赞 mkrieger1 1/15/2023
错误消息告诉您 .它不是你认为的列表。您需要检查调用函数的代码。显然是 ,它被传入 为 。seqNonePCPtest_data_negNonePCPseq

答:

0赞 undefined symbol 1/15/2023 #1

“range”返回一个数字列表。

因此,“elem”是一个数字。

因此,它不是可迭代的。

你的意思是“for elem in seq”吗?

评论

0赞 cards 1/15/2023
不要使用答案来写评论
0赞 alxn 1/15/2023
这是我的第一个想法,然后我看到有人改变了它的范围。无论如何,如果我把“for elem in seq”仍然得到“nonetype object”是不可迭代的
0赞 undefined symbol 1/15/2023
这是他为什么会遇到“迭代”问题的答案——他试图迭代一个数字。
0赞 temur 1/15/2023 #2

下面是应该可以工作的代码的修改版本:

def PCP(seq, feature):
  l = []
  mean = st.mean(list(feature.values()))
  std = np.std(list(feature.values()))
  for elem in seq:
      for aa in elem:
          if aa in feature:
              l.append((feature[aa]-mean)/std)
          else:
              l.append(0)
  return l

我所做的主要更改是:

  • 我没有使用“range(len(seq))”来遍历序列列表,而是直接使用“seq”。这样,“elem”将是列表中的实际字符串,而不是字符串的索引。
  • 在嵌套循环中,我使用“aa”作为变量来遍历字符串中的字符。
  • 在检查当前字符是否在特征字典中时,我使用了 in 关键字而不是“keys[s]”。这是因为 “keys()” 是一个返回字典键的类似列表对象的方法,您需要使用 “[]” 来访问列表中的项。由于“aa”是一个字符串而不是索引,你可以直接检查它是否在字典中。
  • 我将“return l”语句移到了嵌套循环之外,这样它只在完成所有计算后发生一次。

通过这些更改,代码应按预期工作,并将计算值追加到特征字典中具有相应值的序列中每个氨基酸的 l 列表中。

评论

0赞 alxn 1/15/2023
我运行您的代码,但仍然得到“NoneType”对象对于 seq 中 elem 的 -> 不可迭代。你能看看我作为 seq 输入的数据片段吗,我的特征 dict: ['KISKDLSIAVQMMKRIHSLLERYPEIL', 'SGRVEKSPHEQEIKFFAKILLPLINQY', 'IDQLIVFGEQLIQKSEPLDAVLIEDEL', ..] pI= {“K”:9.47, “P”:6.3, “R”:10.76, “T”:5.6, “A”:6.11, “C”:5.02, “D”:2.98, “E”:3.08, “F”:5.91, “G”:6.06, “H”:7.64......} 也许他们错了