Как подсчитать количество одинаковых символов в строке по позиции, используя python?

1

Например:

String 1: AGGCCT
          || | |
String 2: AGCCAT

Эти две строки идентичны в 4-х позициях, поэтому функция, которую я хочу, вернет 4.

Есть ли умный (т.е. быстрый) метод для этого, кроме очевидного метода итерации через обе строки в одно и то же время?

Спасибо! Uri

  • 1
    Пожалуйста, отправьте код, который у вас есть. Если вы выполняете итерацию по позиции, это один проход через обе строки. Что в этом плохого? Пожалуйста, оставьте свой код, чтобы мы могли прокомментировать его.
  • 0
    Ибо петли медленны в питоне. На самом деле, я спрашиваю, есть ли какая-то встроенная функция (реализованная в C), которую я могу использовать, чтобы сделать это очень быстро. Это неверно? (И это не домашнее задание.)
Теги:
string

3 ответа

7
Лучший ответ

Я не думаю, что любой "умный" трюк бьет очевидный подход, если он хорошо выполнен:

sum(c1 == c2 for c1, c2 in itertools.izip(s1, s2))

Или, если использование булевых чисел для арифметических раздражает вас,

sum(1 for c1, c2 in itertools.izip(s1, s2) if c1 == c2)
  • 0
    Эти строки [ACGT]+ могут быть очень длинными. zip(...) - это список. Рассмотрите возможность использования itertools.izip .
  • 0
    @ Джон: Спасибо за подсказку. Я постоянно забываю, что Python 2 использует списки вместо итератора во многих встроенных модулях. Исправлена.
Показать ещё 2 комментария
1

Если вы ищете лучшую производительность, я подозреваю, что для этого будет сложно бить numpy:

import numpy as np
a1 = np.frombuffer(s1, dtype=np.byte)
a2 = np.frombuffer(s2, dtype=np.byte)
print (a1==a2).sum()

В моей системе это работает примерно в 10 раз быстрее, чем использование itertools.

1

Хотя я предпочитаю выражение генератора delnan, это также работает:

>>> from itertools import imap
>>> from operator import eq
>>> sum(imap(eq, 'abcde', 'aacce'))
3

Ещё вопросы

Сообщество Overcoder
Наверх
Меню