简体   繁体   中英

Removing common values from two lists in python

Hi let's say that I have two lists in python and I want to remove common values from both lists. A potential solution is:

x = [1, 2, 3, 4, 5, 6, 7, 8]
y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4]
for i in x:
    if i in y:
        x.remove(i)
        y.remove(i)

it seems correct but it is not. The reason, I guess, is because by removing an item from the list the index continues to iterate. Therefore, for two common values in the lists where the values are near each other we will be missing the later values (the code will not iterate through it). The result would be:

>>> x
[1, 3, 5, 6, 8, 9, 10]
>>> y
[43, 3123, 543, 76, 879, 32, 14241, 342, 3]

So we are missing the value '3' .

Is the reason of that behaviour the one that I mentioned? or am I doing something else wrong?

Just slight change your code,Iterate through the copy of x it's x[:] .You are modifying the list while iterating over it. So that's why you are missing value 3

for i in x[:]:
      if i in y:
          x.remove(i)
          y.remove(i)

And alternative method

x,y = [i for i in x if i not in y],[j for j in y if j not in x]

You can also use difference of set objects.

a = list(set(y) - set(x))
b = list(set(x) - set(y))
z=[i for i in x if i not in y]
w=[i for i in y if i not in x]
x=z
y=w

That should do the trick? It's a bit less memory efficient.

If you use numpy , then all you need is:

x, y = np.setdiff1d(x, y), np.setdiff1d(y, x)

and if you don't want to use numpy:

x, y = list(set(x).difference(y)), list(set(y).difference(x))

I personally think Python's set data type is the way to go:

You can do something like this:

>>> x = [1, 2, 3, 4, 5, 6, 7, 8]
>>> y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4]
>>> sx = set(x)
>>> sy = set(y)
>>> sx.union(sy)
set([1, 2, 3, 4, 5, 6, 7, 8, 32, 43, 76, 342, 543, 879, 3123, 14241])

Or you can reduce it to a one liner:

list(set(x).union(set(y)))

You can use set method to remove elements in list.

s1=input()
s2=input()
str=list(set(s1).symmetric_difference(set(s2)))
print(str)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM