【问题标题】:Finding unique combinations of two strings in python在python中查找两个字符串的唯一组合
【发布时间】:2015-04-09 13:59:21
【问题描述】:

我有两个字符串:

StringA: ['K', 'T', 'T', 'T', 'K', 'K', 'G', 'T', 'T', 'T', 'T', 'K', 'K']

StringB: ['T', 'K', 'G', 'G', 'K', 'T', 'T', 'K', 'G', 'G', 'K', 'K', 'T']

我想测试有多少种独特的字母组合。字符串是有序的,所以我只想匹配StringA位置1和StringB位置1,StringA位置2和StringB位置2等等。所以上面字符串中的对是(KT), (TK), (TG), (TG), (KK), (KT), (GT), (TK), (TG), (TG), (TK), (KK), (KT)。

并且有5个独特的组合:(KT), (TK), (TG), (GT), (KK)

我使用以下代码从两个 .csv 文件生成字符串。

import sys
import csv

pairlist = open(sys.argv[1], 'r')
snp_file = open(sys.argv[2], 'r')

pair = csv.reader(pairlist, delimiter=',')
snps = csv.reader(snp_file, delimiter=',')

output = open(sys.argv[1]+"_FGT_Result", 'w')

snp1 = []
snp2 = []

firstpair = pair.next()

locusa = firstpair[0]
locusb = firstpair[1]

f = snps
        #search = snp.readlines()
for i, row in enumerate(f):
    if locusa in row:
        hita = row
        #print hita
        snp1.append(hita[2])
    if locusb in row:
        hitb = row
        #print hitb
        snp2.append(hitb[2])

print snp1
print snp2

pairlist.close()
snp_file.close()
output.close()

但我不知道如何进行比较。我试图将字符串转换为集合,正如我在另一个线程中读到的那样,这是必需的,但我不知道为什么,我无法让它工作。

【问题讨论】:

  • 查看zip函数。这就是你需要做的一半。

标签: python string python-2.7 compare unique


【解决方案1】:

只需使用zip 和set 组合两个字符串列表并获得唯一的组合。我使用列表推导返回组合字符串:

>>> unique = [''.join(x)  for x in set(list(zip(StringA, StringB)))]
>>> unique
['TG', 'GT', 'KT', 'TK', 'KK']

或者,如果您只是希望它们在 set 中,您可以删除列表理解:

>>> unique = set(zip(StringA, StringB))
>>> unique
{('T', 'K'), ('T', 'G'), ('K', 'K'), ('K', 'T'), ('G', 'T')}

【讨论】:

    【解决方案2】:
    snp1 = ['K', 'T', 'T', 'T', 'K', 'K', 'G', 'T', 'T', 'T', 'T', 'K', 'K']
    snp2 = ['T', 'K', 'G', 'G', 'K', 'T', 'T', 'K', 'G', 'G', 'K', 'K', 'T']
    combinations = []
    for a,b in zip(snp1, snp2):
        combinations.append(a+b)         
    
    print list(set(combinations))
    

    输出:

    ['KK', 'TG', 'GT', 'TK', 'KT']
    

    或者一个简单的班轮就可以了:

    list(set([a+b for a,b in zip(snp1, snp2)]))
    

    输出:

    ['KK', 'TG', 'GT', 'TK', 'KT']
    

    【讨论】:

      【解决方案3】:

      您可以使用zip 函数和set 来创建预期列表:

      >>> z=set(zip(a,b))
      >>> z
      set([('T', 'G'), ('K', 'T'), ('T', 'K'), ('G', 'T'), ('K', 'K')])
      

      然后使用 itertools 模块中的 chain 和 combinations 函数来创建组合:

      >>> a=['K', 'T', 'T', 'T', 'K', 'K', 'G', 'T', 'T', 'T', 'T', 'K', 'K']
      >>> b=['T', 'K', 'G', 'G', 'K', 'T', 'T', 'K', 'G', 'G', 'K', 'K', 'T']
      >>> from itertools import combinations,chain
      >>> z=[''.join(k) for k in set(zip(a,b))]
      >>> z
      ['TG', 'KT', 'TK', 'GT', 'KK']
      >>> list(chain.from_iterable(combinations(z, r) for r in range(len(z)+1)))
      [(), ('TG',), ('KT',), ('TK',), ('GT',), ('KK',), ('TG', 'KT'), ('TG', 'TK'), ('TG', 'GT'), ('TG', 'KK'), ('KT', 'TK'), ('KT', 'GT'), ('KT', 'KK'), ('TK', 'GT'), ('TK', 'KK'), ('GT', 'KK'), ('TG', 'KT', 'TK'), ('TG', 'KT', 'GT'), ('TG', 'KT', 'KK'), ('TG', 'TK', 'GT'), ('TG', 'TK', 'KK'), ('TG', 'GT', 'KK'), ('KT', 'TK', 'GT'), ('KT', 'TK', 'KK'), ('KT', 'GT', 'KK'), ('TK', 'GT', 'KK'), ('TG', 'KT', 'TK', 'GT'), ('TG', 'KT', 'TK', 'KK'), ('TG', 'KT', 'GT', 'KK'), ('TG', 'TK', 'GT', 'KK'), ('KT', 'TK', 'GT', 'KK'), ('TG', 'KT', 'TK', 'GT', 'KK')]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多