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

2024-10-01 02:25:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用Counter()和most\u 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中:sequence,count代表upper,count代表lower。在

^{pr2}$

但是,有一个在上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 

上千排。我仔细检查了这个文件,发现它确实打印了在第二个列表中找到该项的下一个计数。因为它已经找到匹配项,所以我需要它转到列表1中的下一个,以便在列表2中查找它,因为我知道该项不会再次出现。我还需要保持Counter()创建的列表的排序顺序。在

感谢所有的帮助。在


Tags: 代码most列表counter序列commonelselow
1条回答
网友
1楼 · 发布于 2024-10-01 02:25:13

不需要在第二个计数器上调用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检查该项是否存在。在

相关问题 更多 >