Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > How to check for single character change in a string?

Reply
Thread Tools

How to check for single character change in a string?

 
 
tinnews@isbd.co.uk
Guest
Posts: n/a
 
      12-24-2011
Can anyone suggest a simple/easy way to count how many characters have
changed in a string?

E.g. giving results as follows:-

abcdefg abcdefh 1
abcdefg abcdekk 2
abcdefg gfedcba 6


Note that position is significant, a character in a different position
should not count as a match.

Is there any simpler/neater way than just a for loop running through
both strings and counting non-matching characters?

--
Chris Green
 
Reply With Quote
 
 
 
 
Ian Kelly
Guest
Posts: n/a
 
      12-24-2011
On Sat, Dec 24, 2011 at 8:26 AM, <(E-Mail Removed)> wrote:
> Can anyone suggest a simple/easy way to count how many characters have
> changed in a string?
>
> E.g. giving results as follows:-
>
> * *abcdefg * * abcdefh * * * * 1
> * *abcdefg * * abcdekk * * * * 2
> * *abcdefg * * gfedcba * * * * 6
>
>
> Note that position is significant, a character in a different position
> should not count as a match.
>
> Is there any simpler/neater way than just a for loop running through
> both strings and counting non-matching characters?


No, but the loop approach is pretty simple:

sum(a == b for a, b in zip(str1, str2))
 
Reply With Quote
 
 
 
 
Roy Smith
Guest
Posts: n/a
 
      12-24-2011
In article <(E-Mail Removed)>, http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:

> Can anyone suggest a simple/easy way to count how many characters have
> changed in a string?


Depending on exactly how you define "changed", you're probably talking
about either Hamming Distance or Levenshtein Distance. I would start
with the wikipedia articles on both those topics and explore from there.

There are python packages for computing many of these metrics. For
example, http://pypi.python.org/pypi/python-Levenshtein/

> Is there any simpler/neater way than just a for loop running through
> both strings and counting non-matching characters?


If you don't care about insertions and deletions (and it sounds like you
don't), then this is the way to do it. It's O(n), and you're not going
to get any better than that. It's a one-liner in python:

>>> s1 = 'abcdefg'
>>> s2 = 'abcdekk'


>>> len([x for x in zip(s1, s2) if x[0] != x[1]])

2

But go read the wikipedia articles. Computing distance between
sequences is an interesting, important, and well-studied topic. It's
worth exploring a bit.
 
Reply With Quote
 
Roy Smith
Guest
Posts: n/a
 
      12-24-2011
In article <(E-Mail Removed)>,
Roy Smith <(E-Mail Removed)> wrote:

> >>> len([x for x in zip(s1, s2) if x[0] != x[1]])


Heh, Ian Kelly's version:

> sum(a == b for a, b in zip(str1, str2))


is cleaner than mine. Except that Ian's counts matches and the OP asked
for non-matches, but that's an exercise for the reader
 
Reply With Quote
 
Arnaud Delobelle
Guest
Posts: n/a
 
      12-24-2011
On 24 December 2011 16:10, Roy Smith <(E-Mail Removed)> wrote:
> In article <(E-Mail Removed)>,
> *Roy Smith <(E-Mail Removed)> wrote:
>
>> >>> len([x for x in zip(s1, s2) if x[0] != x[1]])

>
> Heh, Ian Kelly's version:
>
>> sum(a == b for a, b in zip(str1, str2))

>
> is cleaner than mine. *Except that Ian's counts matches and the OP asked
> for non-matches, but that's an exercise for the reader


Here's a variation on the same theme:

sum(map(str.__ne__, str1, str2))

--
Arnaud
 
Reply With Quote
 
Rick Johnson
Guest
Posts: n/a
 
      12-24-2011
On Dec 24, 11:09*am, Arnaud Delobelle <(E-Mail Removed)> wrote:

> sum(map(str.__ne__, str1, str2))


Mirror, mirror, on the wall. Who's the cleanest of them all?
 
Reply With Quote
 
tinnews@isbd.co.uk
Guest
Posts: n/a
 
      12-26-2011
Roy Smith <(E-Mail Removed)> wrote:
> In article <(E-Mail Removed)>,
> Roy Smith <(E-Mail Removed)> wrote:
>
> > >>> len([x for x in zip(s1, s2) if x[0] != x[1]])

>
> Heh, Ian Kelly's version:
>
> > sum(a == b for a, b in zip(str1, str2))

>
> is cleaner than mine. Except that Ian's counts matches and the OP asked
> for non-matches, but that's an exercise for the reader




I'm actually walking through a directory tree and checking that file
characteristics don't change in a sequence of files.

What I'm looking for is 'unusual' changes in file characteristics
(they're image files with camera information and such in them) in a
sequential list of files.

Thus if file001, file002, file003, file004 have the same camera type
I'm happy, but if file003 appears to have been taken with a different
camera something is probably amiss. I realise there will be *two*
character changes when going from file009 to file010 but I can cope
with that. I can't just extract the sequence number because in some
cases they have non-numeric names, etc.

--
Chris Green
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Change a single character in a string Tom de Neef Javascript 9 02-19-2008 08:27 PM
check and convert lower character to upper character alessio211734@yahoo.it C++ 3 11-18-2007 11:28 AM
A Paradise DNS address change? What change? There was no change. Tony Neville NZ Computing 7 09-22-2006 01:02 PM
BoundColumn single DataBind equiv but not in a single row? Randall Parker ASP .Net 1 12-12-2005 04:11 PM



Advertisments