17

So to give a rough example without any code written for it yet, I'm curious on how I would be able to figure out what both lists have in common.

Example:

listA = ['a', 'b', 'c']
listB = ['a', 'h', 'c']

I'd like to be able to return:

['a', 'c']

How so?

Possibly with variable strings like:

john = 'I love yellow and green'
mary = 'I love yellow and red'

And return:

'I love yellow and'
0

5 Answers 5

37

Use set intersection for this:

list(set(listA) & set(listB))

gives:

['a', 'c']

Note that since we are dealing with sets this may not preserve order:

' '.join(list(set(john.split()) & set(mary.split())))
'I and love yellow'

using join() to convert the resulting list into a string.

--

For your example/comment below, this will preserve order (inspired by comment from @DSM)

' '.join([j for j, m in zip(john.split(), mary.split()) if j==m])
'I love yellow and'

For a case where the list aren't the same length, with the result as specified in the comment below:

aa = ['a', 'b', 'c']
bb = ['c', 'b', 'd', 'a']

[a for a, b in zip(aa, bb) if a==b]
['b']
Sign up to request clarification or add additional context in comments.

7 Comments

Is there anyway to preserve order?
@Matthew: what would you like this method to return in case of ['a', 'b', 'c'] and ['c', 'b', 'd', 'a']?
I'd like to see it return ['b'].
' '.join([j for j, m in zip(john.split(), mary.split()) if j==m]) is exactly what I'm looking for! Now to look into seeing how you did it to learn myself! Thanks so much! How would I go about doing it to check a total of say.. 5 strings at the same time?
@Matthew You could extend this example to more lists, zip can handle more than two lists, e.g., for i,j,k in zip(aa, bb, cc): print i, j, k .. if your problem ends up being more complex other solutions might exist (but that should be a different question/post)
|
3

If order doesn't matter, but you want to print out a nice diff:


def diff(a, b):
  if len(set(a) - set(b)) > 0:
    print(f"Items removed: {set(a) - set(b)}")
  if len(set(b) - set(a)) > 0:
    print(f"Items added: {set(b) - set(a)}")
  if set(a) == set(b):
    print(f"They are the same")

diff([1,2,3,4], [1,2,3])
# Items removed: {4}

diff([3,4], [1,2,3])
# Items removed: {4}
# Items added: {1, 2}

diff([], [1,2,3])
# Items added: {1, 2, 3}

diff([1,2,3], [1])
# Items removed: {2, 3}

listA = ['a', 'b', 'c']
listB = ['a', 'h', 'c']
diff(listA, listB)
# Items removed: {'b'}
# Items added: {'h'}

john = 'I love yellow and green'
mary = 'I love yellow and red'
diff(john, mary)
# Items removed: {'g'}

Comments

2

If the two lists are the same length, you can do a side-by-side iteration, like so:

list_common = []
for a, b in zip(list_a, list_b):
    if a == b:
        list_common.append(a)

3 Comments

You'd need to use zip(list_a, list_b), I think.
They're not the same length. I might have one list that has ['green'] and another that has ['red', 'yellow', 'green']And I'd need it to return ['green']
Then yes, go with the set option put forth by other users.
1

Intersect them as sets:

set(listA) & set(listB)

2 Comments

Could you give me a working example on how I could about using it with: john = 'I love yellow and green' mary = 'I love yellow and red' And return: 'I love yellow and'
' '.join(set(john.split(' ')) & set(mary.split(' ')))
1

i think this is what u want ask me anything about it i will try to answer it

    listA = ['a', 'b', 'c']
listB = ['a', 'h', 'c']
new1=[]
for a in listA:
    if a in listB:
        new1.append(a)

john = 'I love yellow and green'
mary = 'I love yellow and red'
j=john.split()
m=mary.split()
new2 = []
for a in j:
    if a in m:
        new2.append(a)
x = " ".join(new2)
print(x)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.