比较使用Counter()生成的不同长度的两个列表
我正在尝试使用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 个回答
其实你不需要在第二个计数器上调用 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
来检查这个项目是否存在。