有人能解释为什么在循环中使用Counter类而不是在理解中使用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循环中获得后一种行为?在
使用
update
传递一个iterable,该iterable被遍历并对值进行计数。由于str
被认为是可编辑的,因此每个字符都作为一个单独的元素来计算。在在构造函数的情况下,iterable由整个字符串组成,因此将计算strigns而不是它们所包含的字符。在
字符串、列表和其他东西在Python中是“iterables”,这意味着它们可以循环使用。在
for
循环中,将每个单独的字符串传递给counts1.update()
。由于字符串是iterable,因此counts1.update()
逐字遍历字符串,计算单个字符。在在列表理解{}中,列表理解本身是一个提供三个元素的iterable。
collections.Counter()
iterates遍历给定的iterable,它只有三个元素,并对每个元素计数。在update()
需要iterable并将尝试在其上迭代,字符串是iterable:seq
是GATAGCTCGC
,将用作['G', 'A', 'T' ....]
要有同样的行为,给它一个列表:
^{pr2}$相关问题 更多 >
编程相关推荐