我有两个字符串:
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()
但我无法弄清楚如何进行比较。我试图将字符串转换为集合,正如我在另一个线程中读到的那样,这是必需的,但我不知道为什么,我无法让它工作。
答案 0 :(得分:3)
只需使用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')}
答案 1 :(得分:0)
您可以使用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')]
答案 2 :(得分:0)
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']