for循环与理解中的Python Counter类行为

时间:2016-01-05 13:46:30

标签: python for-loop counter dictionary-comprehension

有人可以解释为什么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循环中获得后一种行为?

3 个答案:

答案 0 :(得分:2)

update()期望迭代,并尝试迭代它,字符串是可迭代的:

for seq in seqs:
    counts1.update(seq)

seqGATAGCTCGC,将用作['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将被计算而不是它们所包含的字符。