【问题标题】:comparing two lists of different lengths generated from Counter() python比较从 Counter() python 生成的两个不同长度的列表
【发布时间】:2014-06-11 17:07:56
【问题描述】:

我正在尝试使用 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 

为数千行。我已经筛选了这个文件,发现它确实打印了在第二个列表中找到该项目的下一个计数。由于它已经找到它的匹配项,我需要它继续到列表一中的下一个以在列表二中查找它,因为我知道该项目不会再次出现。我还需要保持 Counter() 创建的列表的排序顺序。

感谢所有帮助。

【问题讨论】:

    标签: python list 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 来检查该项目是否存在。

    【讨论】:

    • 谢谢,interjay。这很有帮助。我还有另一个问题,我不太确定如何解决。我正在以类似的方式接近它。我在第 1 列中有一个包含多个相同序列的文件,在第 2 列中我有数字,对于第 1 列中的相同项目,这些数字都是不同的。所以,我想打印到一个新文件,即第 1 列中的项目,如何很多时候它与计数器一起出现,然后在第三列中,打印第二列中第一个文件中的数字,但是很多都用逗号分隔。
    猜你喜欢
    • 2017-12-24
    • 2021-02-25
    • 2018-07-03
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多