比较使用Counter()生成的不同长度的两个列表

0 投票
1 回答
527 浏览
提问于 2025-04-18 09:27

我正在尝试使用Counter()和most_common()来统计两个列表中氨基酸的出现次数。我们把这两个列表分别叫做“upper”和“lower”。

counterup = Counter(upperseqs)
counterlow = Counter(lowerseqs)
countermc_up = (counterup.most_common(500))
countermc_low = (counterlow.most_common())

print len(countermc_up)
print len(countermc_low)

for k,v in countermc_up:
    for x,y in countermc_low:
        if x == k:
            print >> fh1, k, '\t', v, '\t', y
        elif x != k:
            print >> fh1, k, '\t', v, '\t', "0.00"
        else:
            print "No Matches found!! Try again!"

我想从“upper”列表中获取前500个序列,并想把这些序列的出现次数与“lower”列表中的所有序列进行比较。第二个列表大约有36,000个项目。

当我运行代码时,如果不加elif和else语句,我得到了我想要的结果。所有在第二个列表中的匹配项都会被打印到我之前打开的一个文件中,格式是用制表符分隔的:序列,上面的计数,下面的计数。

CARYLGYNSNWYPFDYW       589778  427779
CARDYRGYSGYNDAFNIW      294911  29343
CARKIGYSSGSEDYW         187806  90299
CARHLGYNNSWYPFDYW       82820   88700
CARHLGYNSAWYPFDYW       55642   45723
CARHLGYNDSWYPFDYW       44338   30974
CAKDFRGYTGYNDAFDIW      34638   9703
CARHLGYNSDWYPFDYW       23476   15692
CARHLGYNSVWYPFDYW       16223   12220
CARHLGYNSNWYPFDYW       15673   17198
 ......
CARYLNSWPY              89      0.00

但是,在前500个列表中有一个序列不在下一个列表里,我需要找出是哪一个。我还会用这个方法处理其他大小不同的第二个列表,因为我知道在第一个列表中会找到的项目会更少。我希望代码能做到的是,如果该序列在第二个列表中不存在,就在第三列输入“0.00”。

当我运行带有elif和else语句的代码时,第一行的结果是完美的:

例如:
CARYLGYNSNWYPFDYW 589778 427779

但是代码继续只使用第一个序列,直到遍历完第二个列表中的所有项目。所以我得到了:

CARYLGYNSNWYPFDYW       589778  0.00
CARYLGYNSNWYPFDYW       589778  0.00
CARYLGYNSNWYPFDYW       589778  0.00
CARYLGYNSNWYPFDYW       589778  0.00
CARYLGYNSNWYPFDYW       589778  0.00
CARYLGYNSNWYPFDYW       589778  0.00 

成千上万行的结果。我查看了这个文件,发现它确实在第二个列表中找到了下一个计数。由于它已经找到了匹配项,我需要它继续查找第一个列表中的下一个项目,因为我知道这个项目不会再出现。我还需要保持Counter()创建的列表的排序顺序。

非常感谢大家的帮助。

1 个回答

0

其实你不需要在第二个计数器上调用 most_common。你可以直接把它当成字典来用,这样就能得到每个元素的数量(如果元素不存在,就会返回0):

counterup = Counter(upperseqs)
counterlow = Counter(lowerseqs)
countermc_up = counterup.most_common(500)

for k,v in countermc_up:
    print >> fh1, k, '\t', v, '\t', counterlow[k]

这样做的速度也会比你的代码快很多,因为没有嵌套循环。

如果某个项目在第二个计数器中不存在,它会打印 0。如果你想特别处理这种情况,可以用 k in counterlow 来检查这个项目是否存在。

撰写回答