【问题标题】:How to intersect two horizontal lists using python?如何使用python相交两个水平列表?
【发布时间】:2011-08-25 17:02:19
【问题描述】:

在我正在编写的代码中,我需要将两个水平列表相交,例如:

列表A:

chr1    aatt
chr8    tagg
chr11   aaaa
chr7    gtag

列表B

chr8    tagt
chr1    tttt
chr7    gtag
chr11   aaaa
chr9    atat

#This lists are compounded by one str per line, wich it has a "/t" in the middle. 
#Also note that are in different order

我怎样才能得到这两个列表之间的交集?

想要的结果:

chr7    gtag
chr11   aaaa

我还可以生成每行两个字符串的列表,如下所示:\

列表A:

('chr1', 'aatt')
('chr8', 'tagg')
('chr11', 'aaaa')
('chr7', 'gtag')

列表B

('chr8', 'tagt')
('chr1', 'tttt')
('chr7', 'gtag')
('chr11','aaaa')
('chr9', 'atat')

在这种情况下,重要的是必须将两列视为一列

感谢您的宝贵时间!

【问题讨论】:

    标签: python list intersection


    【解决方案1】:

    将 numpy 导入为 np

    np.intersect_nu(list1, list2)
    

    【讨论】:

      【解决方案2】:

      也许通过不从列表中创建 2 个集合来优化性能,这需要对列表中的所有项目进行散列,但只创建 1 个集合并遍历第二个列表。如果您知道哪个列表大,哪个列表小,也会有所帮助。

      def intersect(smallList, largeList):
          values = set(smallList)
          intersection = []
      
          for v in largeList:
              if v in values:
                  intersection.append(v)
      
          return intersection
      

      【讨论】:

        【解决方案3】:

        使用集合交集。

        setC = set(listA) & set(listB)
        listC = list(setC) # if you really need a list
        

        【讨论】:

        • 你看到上面两个相同的答案了吗?
        • 技术上这个答案是三个中最正确的,因为它返回一个列表。
        • 嗯,不相信,他们要求一个交叉点,而不是具体的列表。无论如何,加上一个集合显然是最合适的返回值。
        【解决方案4】:

        使用 Python sets

        listA = (
            ('chr1', 'aatt'),
            ('chr8', 'tagg'),
            ('chr11', 'aaaa'),
            ('chr7', 'gtag'),
        )
        
        listB = (
            ('chr8', 'tagt'),
            ('chr1', 'tttt'),
            ('chr7', 'gtag'),
            ('chr11','aaaa'),
            ('chr9', 'atat'),
        )
        
        combined = set(listA).intersection(set(listB))
        for c, d in combined:
            print c, d
        

        您也可以像这样使用&

        combined = set(listA) & set(listB)
        

        【讨论】:

          【解决方案5】:

          转换为集合并相交:set(a) & set(b)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-05
            • 1970-01-01
            • 1970-01-01
            • 2014-12-13
            • 2011-04-28
            相关资源
            最近更新 更多