2015-02-10 12 views
3

Я пытаюсь подсчитать количество различий между двумя импортированными строками (seq1 и seq2, код импорта не указан), но я не получаю результата при запуске программы. Я хочу, чтобы результат читал что-то вроде «2 отличия». Не знаю, где я буду неправильно ...Подсчет различий между двумя строками

def difference (seq1, seq2):  
    count = 0 
    for i in seq1: 
     if seq1[i] != seq2[i]: 
      count += 1 
     return (count) 
    print (count, "differences") 
+0

отступы очень важно .. –

+0

Количество = сумма (1 для а, б, в молнии (seq1, seq2) если! = Б) печати (количество) работал отлично! –

ответ

7

Вы можете сделать это довольно плоско с выражением генератора

count = sum(1 for a, b in zip(seq1, seq2) if a != b) 

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

count = sum(1 for a, b in zip(seq1, seq2) if a != b) + abs(len(seq1) - len(seq2)) 

Другой weirdish способ, чтобы написать то, что имеет преимущество True быть 1 и False быть 0 является:

sum(a != b for a, b in zip(seq1, seq2))+ abs(len(seq1) - len(seq2)) 

zip является питон встроенный, который позволяет выполнять итерацию по двум последовательностям одновременно. Это также будет прекращено по кратчайшему последовательности, заметит:

>>> seq1 = 'hi' 
>>> seq2 = 'world' 
>>> for a, b in zip(seq1, seq2): 
...  print('a =', a, '| b =', b) 
... 
a = h | b = w 
a = i | b = o 

Это будет оценивать похоже на sum([1, 1, 1]) где каждый 1 представляет собой разность между двумя последовательностями. Фильтр if a != b заставляет генератор генерировать значение только тогда, когда a и b отличаются.

+0

Он возвращает '1', проверенный на' hey' и 'hello'. – GLHF

+0

@howaboutNO hm, из OP казалось, что последовательности были одинаковой длины, но хорошая точка, я отрегулирую –

+0

use itertools.izip_longest :) – Hackaholic

1

Когда вы говорите for i in seq1 вы итерация персонажей, а не индексов. Вы можете использовать enumerate, указав вместо этого for i, ch in enumerate(seq1).

Или даже лучше, используйте стандартную функцию zip, чтобы пройти через обе последовательности одновременно.

У вас также есть проблема, потому что вы return перед вами print. Вероятно, ваш return должен быть перемещен вниз и незакреплен.

0

Правильный код будет:

def difference(seq1, seq2): 
    count = 0 
    for i in range(len(seq1)): 
     if seq1[i] != seq2[i]: 
      count += 1 
    return count 

Первое возвращение заявление сделано в конце функции, поэтому она не должна быть частью для цикла или цикл будет просто запустить один раз. Второй для цикла не было правильным, потому что вы не были на самом деле говорил давая цикл целое, поэтому правильный код будет дать ему диапазон длины Seq1, так:

for i in range(len(seq1)): 

Надежда это помогает! :)

Смежные вопросы