我试图使用Counter()和most_common()来计算两个列表中氨基酸的出现次数。让我们把它们称为上下:
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!"
所以我想要来自我的"鞋帮"列表,我想比较这些序列的计数,如果它们存在,那么所有那些序列将包含在seconed" lower"名单。这是大约36K项目,在第二个列表中有计数。
当我运行代码时,没有elif,else语句,我得到了我想要的东西。第二个列表中包含的所有匹配都打印到fh,我之前打开过,以制表符分隔的格式:序列,计数为高,计数为低。
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运行它时会发生什么,否则声明,我得到第一行完美:
例: 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
成千上万行。我已经筛选了这个文件,发现它确实打印了第二个列表中找到该项目的下一个计数。由于它已经找到它的匹配,我需要它继续进入列表一中的下一个以在列表2中查找它,因为我知道该项目不会再次出现。我还需要保持Counter()创建的列表的排序顺序。
感谢所有帮助。
答案 0 :(得分: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
检查项目是否存在。