比较字符串,只是让那些在相同位置的人保持不同的字符

时间:2015-09-01 06:48:18

标签: regex python-2.7

我的问题如下:我有一个文件,其中包含大约70个字符串,所有字符串都有6个字符(每个位置都有a,c,g或t - >这些是短DNA序列)。

例如:

System.out.println("Total for " + quant + typeofPizza + "is :" + total);

我需要的是完全独特的字符串。与其他字符串相比,每个位置都有不同的字符(基数)。

在这种情况下,我会得到两个匹配(我将它们定义为列表,但这只是输出格式的一个想法):

accggt agctta gggatc gactta ccttgg

列表1的元素在每个不同的位置上,因此也是列表2的元素。

是否有可以执行此操作的内置函数?我也想过正则表达,但我并不熟悉这种方法。

提前致谢!

修改 好吧,似乎并不容易描述。让我们进一步详细说明: 我们来看上面提到的五个字符串:

我会开始将第一个字符串与所有其他字符串进行比较,然后继续使用字符串2与所有其他字符串进行比较,依此类推。

第一个字符串的第一个字符是a。 第二个字符串的第一个字符也是a。 这意味着我会丢弃第二个字符串。

第三个字符串的第一个字符是g。 精细。 第一个字符串的第二个字符是c。 第三个字符串的第二个字符是g。 精细。 第一个字符串的第三个字符是c。 第三个字符串的第三个字符是g。 精细。 第四......等等。

如果一个字符串的所有字符都与另一个字符串的字符不同(在如上所述的每个位置上),我会保留这两个字符串并搜索下一个字符串,这些字符串在每个位置上与字符串I相比不同已经找到了。因为我只有四个字母,所以不同字符串应该只有四种可能性。

我应该最终得到一个列表,其中包含每个位置都不同的字符串组。

我希望这会有所帮助。

3 个答案:

答案 0 :(得分:1)

您可以使用以下算法:遍历字符串中所有可能的单词组合,并检查每对与ERROR: syntax error at or near "'))'" 的相等性。

这是一个片段:

if [x == y for (x, y) in zip(word, nextWord)].count(True) == 0:

IDEONE demo的结果:

s = "accggt agctta gggatc gactta ccttgg"
chks = s.split(" ");
for word in chks:
    for nextWord in chks:
        if word != nextWord:
            if [x == y for (x, y) in zip(word, nextWord)].count(True) == 0:
                print([word, nextWord])

<强>更新

您可以使用自定义功能对列表进行重复数据删除。这是一个更新的代码段:

['accggt', 'gggatc']
['gggatc', 'accggt']
['gggatc', 'ccttgg']
['ccttgg', 'gggatc']

结果:def dedup(lst): seen = set() result = [] for item in lst: fs = frozenset(item) if fs not in seen: result.append(item) seen.add(fs) return result res = [] s = "accggt agctta gggatc gactta ccttgg" chks = s.split(" "); for word in chks: for nextWord in chks: if word != nextWord: if [x == y for (x, y) in zip(word, nextWord)].count(True) == 0: res.append([word, nextWord]) print(dedup(res))

要按3检查单词,您需要将字符串的所有可能排列创建为3个单词的组合,并使用以下内容:

[['accggt', 'gggatc'], ['gggatc', 'ccttgg']]

答案 1 :(得分:0)

要查找每个字符完全不同的DNA字符串,您必须检查每个字符串与任何其他字符串,如果有任何字符给定的字符串与比较字符串中的相同位置上的字符相同。

以下是一个示例代码:

# read all dna strings into a list of strings
dna = ['accggt', 'agctta', 'gggatc', 'gactta', 'ccttgg', '123456']

def compare_two_dna(dna1, dna2):
    i = 0
    l = len(dna1)

    while(i < l):
        if dna1[i] == dna2[i]:
            return True
        i += 1
    return False

def is_dna_unique(d, dna_strings):
    return len(filter(lambda x: compare_two_dna(d, x), dna_strings)) == 1

# filter all items which only occure once in the list
unique_dna = filter(lambda d: is_dna_unique(d, dna), dna)

print(unique_dna)

此处的结果是:123456

答案 2 :(得分:0)

var dnaList = "accggt agctta gggatc gactta ccttgg".split( " " );

function getUniqueDnas( dna_list ){
  var result = [];
  for( var d1 in dna_list ){
    var isRepeat = false;
    var dna1 = dna_list[ d1 ];
    for( var d2 in dna_list ){
      var dna2 = dna_list[ d2 ];
      if( dna1 == dna2 ){
        isRepeat = true;
        break;
      }
    }
    if( !isRepeat ) 
      result.push( dna1 );
  }
  return result;
}

var uniqueDnaList = getUniqueDnas( dnaList );