有人可以解释为什么Counter类的行为在循环中使用时会改变而不是理解中吗?以下是一个简单的例子:
>>> seqs = ["GATAGCTCGC", "GTAGAGCTCGCTC", "GTATATAGCTCGCCTG"]
>>> import collections
>>> counts1 = collections.Counter()
>>> for seq in seqs:
... counts1.update(seq)
...
>>> counts1
Counter({'G': 11, 'C': 11, 'T': 10, 'A': 7})
>>> counts2 = collections.Counter(seq for seq in seqs)
>>> counts2
Counter({'GTAGAGCTCGCTC': 1, 'GATAGCTCGC': 1, 'GTATATAGCTCGCCTG': 1})
为什么update方法将输入字符串拆分为字符并计算字符而不是整个字符串对象?如何在for循环中获得后一种行为?
答案 0 :(得分:2)
update()
期望迭代,并尝试迭代它,字符串是可迭代的:
for seq in seqs:
counts1.update(seq)
seq
为GATAGCTCGC
,将用作['G', 'A', 'T' ....]
要获得相同的行为,请为其提供一个列表:
for seq in seqs:
counts1.update([seq])
答案 1 :(得分:1)
字符串,列表和其他内容是" iterables"在Python中,意味着它们可以循环使用。在for
循环中,您将每个字符串传递给counts1.update()
。由于字符串是可迭代的,counts1.update()
逐个字符地遍历字符串,计算单个字符。
在列表推导seq for seq in seqs
中,列表推导本身是一个可迭代的,提供三个元素。 collections.Counter()
次迭代遍历它给出的迭代,它只有三个元素,并计算每个元素。
答案 2 :(得分:0)
使用update
传递遍历的迭代并计算值。由于str
被认为是可迭代的,因此每个字符都作为一个单独的元素出现,因此计算出来。
在构造函数的情况下,iterable由整个字符串组成,因此strigns将被计算而不是它们所包含的字符。