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

比较Counter()python生成的两个不同长度的列表,python,list,counter,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(counte

我试图使用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!"
所以我想从我的“上”列表中找出前500个序列,并且我想将这些序列的计数(如果它们存在的话)与第二个“下”列表中包含的所有序列进行比较。第二个列表中约有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,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 
数千行。我仔细检查了这个文件,发现它确实打印了第二个列表中的项目的下一个计数。因为它已经找到了匹配项,所以我需要它转到列表一中的下一个,以便在列表2中查找它,因为我知道该项不会再次出现。我还需要保持Counter()创建的列表的排序顺序


非常感谢您的帮助。

无需在第二个柜台呼叫最常见的
。您可以简单地将其用作字典,它将为您提供每个元素的计数(如果不存在,则为0):

这也将比您的代码快得多,因为没有嵌套循环


如果第二个计数器中不存在项目,则将打印
0
。如果您需要专门处理此情况,您可以在counterlow中使用
k
检查该项目是否存在。

谢谢,interjay。这很有帮助。我还有一个问题,我还不太确定如何解决。我也在以类似的方式处理它。我有一个文件,在第1列中有多个相同的序列,在第2列中有数字,这些数字对于第1列中的相同项都是不同的。所以,我想打印到一个新文件,第1列中的项目,它在计数器中出现了多少次,然后在第三列中,打印第二列中第一个文件中的数字,不管其中有多少都用逗号分隔。
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]