I have a list of lists:
lists = [[1,4,3,2,4], [4,5]]
I want to flatten this list and remove all duplicates; or, in other words, apply a set union operation:
desired_result = [1, 2, 3, 4, 5]
What's the easiest way to do this?
I have a list of lists:
lists = [[1,4,3,2,4], [4,5]]
I want to flatten this list and remove all duplicates; or, in other words, apply a set union operation:
desired_result = [1, 2, 3, 4, 5]
What's the easiest way to do this?
set.union
does what you want:
>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])
You can also do this with more than two lists.
union()
only supports multiple arguments for Python version 2.6 or higher. You seem to use a version before that, so you probably have to use an explicit loop: total = set(); for x in results_list: total.update(x)
(s/;/\n/) –
Syncope results_union = set.union(*(set(el) for el in results_list))
–
Uncoil TypeError: descriptor 'union' requires a 'set' object but received a 'list'
in python 3.6 atleast. –
Boult set.union(*results_list)
you're binding the method descriptor manually, i.e. sending in the first element of results_list
as "self". This makes some weird restrictions: 1. doesn't duck-type properly (now the first element must be a set or instance of a set subclass), and 2. union of an empty results_list
will be an error (incorrect result - should return empty set). –
Lancashire set
s in input. Which explains why it worked for me, because first argument was used as self
. Sorry for the confusion. –
Prole Since you seem to be using Python 2.5 (it would be nice to mention in your Q if you need an A for versions != 2.6, the current production one, by the way;-) and want a list rather than a set as the result, I recommend:
import itertools
...
return list(set(itertools.chain(*result_list)))
itertools is generally a great way to work with iterators (and so with many kinds of sequences or collections) and I heartily recommend you become familiar with it. itertools.chain
, in particular, is documented here.
itertools
package. –
Attestation itertools.chain
works fine in Python 2.4 as well, by the way. –
Meyer You can also follow this style
In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']
In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']
In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']
in comprehension way:
[*{ j for i in lists for j in i }]
or
[*functools.reduce(lambda x,y: {*x, *y}, lists)]
Unions are not supported by lists, which are ordered, but are supported by sets. Check out set.union.
I used the following to do intersections, which avoids the need for sets.
a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)
or,
s = [ x for x in b if x in a ]
© 2022 - 2024 — McMap. All rights reserved.