Reputation: 399
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
Upvotes: 11
Views: 9694
Reputation: 803
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]
Upvotes: 0
Reputation: 152657
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.
Upvotes: 4
Reputation: 24133
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):
Upvotes: 17