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

时间:2014-06-11 17:07:56

标签: python list counter

我试图使用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()创建的列表的排序顺序。

感谢所有帮助。

1 个答案:

答案 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检查项目是否存在。