comparing two lists and finding indices of changes

Question:

I’m trying to compare two lists and find the position and changed character at that position. For example, these are two lists:

list1 = ['I', 'C', 'A', 'N', 'R', 'U', 'N']
list2 = ['I', 'K', 'A', 'N', 'R', 'U', 'T']

I want to be able to output the position and change for the differences in the two lists. As you can see, a letter can be repeated multiple times at a different index position. This is the code that I have tried, but I can’t seem to print out the second location accurately.

for indexing in range(0, len(list1)):
    if list1[indexing] != list2[indexing]:
        dontuseindex = indexing
        poschange = indexing + 1
        changecharacter = list2[indexing]
for indexingagain in range(dontuseindex + 1, len(list1)):
    if list1[indexingagain] != list2[indexingagain]:
        secondposchange = indexingagain + 1
        secondchangecharacter = list2[indexingagain]

Is there a better way to solve this problem or any suggestions to the code I have?

My expected output would be:

2    K
7    T
Asked By: interstellar

||

Answers:

for index, (first, second) in enumerate(zip(list1, list2)):
    if first != second:
        print(index, second)

Output:

1 K
6 T

If you want the output you gave, we need to count from 1 instead of the usual 0:

for index, (first, second) in enumerate(zip(list1, list2), start=1):
Answered By: Peter Wood

Another possibility to save all the not-equal elements with the index is with a list comprehensions:

list1 = ['I', 'C', 'A', 'N', 'R', 'U', 'N']
list2 = ['I', 'K', 'A', 'N', 'R', 'U', 'T']

# Append index, element1 and element2 as tuple to the list if they are not equal
changes = [(i, list1[i], list2[i]) for i in range(len(list1)) if list1[i] != list2[i]]
print(changes)
#prints [(1, 'C', 'K'), (6, 'N', 'T')]

Not exactly what you specified as output but it’s close.

You could print the specified output with a loop:

for i in changes:
    print(i[0] + 1, i[1])
# 2 K
# 7 T

In the comments several alternative ways of designing the list comprehension were suggested:

  • Using enumerate and zip:

    changes = [(i, e1, e2) for i, (e1, e2) in enumerate(zip(list1, list2)) if e1 != e2]
    
  • Using enumerate with start index and zip:

    changes = [(i, e1, e2) for i, (e1, e2) in enumerate(zip(list1, list2), 1)  if e1 != e2]
    
  • Using zip and itertools.count:

    import itertools
    changes = [(i, e1, e2) for i, e1, e2 in zip(itertools.count(), list1, list2)) if e1 != e2]
    
  • Using zip and itertools.count with start-index:

    changes = [(i, e1, e2) for i, e1, e2 in zip(itertools.count(1), list1, list2)) if e1 != e2]
    

All of them producing the same result as the original but using different (better) python features.

Answered By: MSeifert
list1 = ['I', 'C', 'A', 'N', 'R', 'U', 'N']
list2 = ['I', 'K', 'A', 'N', 'R', 'U', 'T']
[i for i, x in enumerate(zip(list1,list2)) if x[0]!=x[1]]

Output:

[1, 6]
Answered By: Sam S.
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.