FAQ
Hello

I've stumble to find a solution to get a list from a set

<code>
aa= ['a','b','c','f']
aa
['a', 'b', 'c', 'f']
set(aa)
{'a', 'c', 'b', 'f'}
[k for k in aa]
['a', 'b', 'c', 'f']

</code>
I repute the comprehension list too expensive, is there another method?

--
goto /dev/null

Search Discussions

  • Peter Otten at May 14, 2011 at 9:33 am

    TheSaint wrote:

    I've stumble to find a solution to get a list from a set

    <code>
    aa= ['a','b','c','f']
    aa
    ['a', 'b', 'c', 'f']
    set(aa)
    To clarify: this creates a new object, so aa is still a list.
    {'a', 'c', 'b', 'f'}
    [k for k in aa]
    ['a', 'b', 'c', 'f']
    So you are actually converting a list to a (new) list here. Of course it
    would have worked with a set or an arbitrary iterable, too.
    </code>
    I repute the comprehension list too expensive, is there another method?
    mylist = list(myset)

    Do you notice the similarity to converting a list to a set?
  • Ben Finney at May 14, 2011 at 2:12 pm

    TheSaint <nobody at nowhere.net.no> writes:

    Hello

    I've stumble to find a solution to get a list from a set

    <code>
    aa= ['a','b','c','f']
    Creates a new list object. Binds the name ?aa? to that object.
    aa
    ['a', 'b', 'c', 'f']
    Evaluates the object referenced by the name ?aa?.
    set(aa)
    {'a', 'c', 'b', 'f'}
    Creates a new set object, populating it with the contents from the list
    object referenced by ?aa?. Doesn't do anything with the new set object,
    which will soon be garbage-collected.
    [k for k in aa]
    ['a', 'b', 'c', 'f']
    Creates a new list object by iterating each of the items from the list
    referenced by ?aa?. Does nothing with the new list object, which will
    soon be garbage-collected.
    </code>
    I repute the comprehension list too expensive, is there another method?
    Another method to do what?

    If you want to bind ?aa? to a new object, do so with an assignment
    statement. (Your example has exactly one assignment statement; all the
    other statements create objects which are never bound to anything.)

    But what is it you actually want to do?

    --
    \ ?The fact that I have no remedy for all the sorrows of the |
    `\ world is no reason for my accepting yours. It simply supports |
    _o__) the strong probability that yours is a fake.? ?Henry L. Mencken |
    Ben Finney
  • TheSaint at May 14, 2011 at 2:51 pm

    Ben Finney wrote:

    Another method to do what?
    Sorry, some time we expect to have said it as we thought it.

    The example was to show that after having made a set

    set(aa)

    the need to get that set converted into a list.
    My knowledge drove me to use a comprehension list as a converter.
    In another post I got to know the simplest way to state

    list(aa)
    Where aa is a set.

    --
    goto /dev/null
  • Ben Finney at May 14, 2011 at 11:21 pm

    TheSaint <nobody at nowhere.net.no> writes:

    The example was to show that after having made a set

    set(aa)

    the need to get that set converted into a list.
    As pointed out: you already know how to create a set from an object;
    creating a list from an object is very similar:

    list(set(aa))

    But why are you doing that? What are you trying to achieve?

    --
    \ ?We are all agreed that your theory is crazy. The question that |
    `\ divides us is whether it is crazy enough to have a chance of |
    _o__) being correct.? ?Niels Bohr (to Wolfgang Pauli), 1958 |
    Ben Finney
  • Chris Torek at May 15, 2011 at 2:11 am
    In article <871v00j2bh.fsf at benfinney.id.au>
    Ben Finney wrote:
    As pointed out: you already know how to create a set from an object;
    creating a list from an object is very similar:

    list(set(aa))

    But why are you doing that? What are you trying to achieve?
    I have no idea why someone *else* is doing that, but I have used
    this very expression to unique-ize a list:
    x = [3, 1, 4, 1, 5, 9, 2, 6]
    x
    [3, 1, 4, 1, 5, 9, 2, 6]
    list(set(x))
    [1, 2, 3, 4, 5, 6, 9]
    >>>

    Of course, this trick only works if all the list elements are
    hashable.

    This might not be the best example since the result is sorted
    "by accident", while other list(set(...)) results are not. Add
    sorted() or .sort() if needed:
    x = ['three', 'one', 'four', 'one', 'five']
    x
    ['three', 'one', 'four', 'one', 'five']
    list(set(x))
    ['four', 'five', 'three', 'one']
    sorted(list(set(x)))
    ['five', 'four', 'one', 'three']
    >>>
    --
    In-Real-Life: Chris Torek, Wind River Systems
    Salt Lake City, UT, USA (40?39.22'N, 111?50.29'W) +1 801 277 2603
    email: gmail (figure it out) http://web.torek.net/torek/index.html
  • SigmundV at May 15, 2011 at 11:18 am
    I think the OP wants to find the intersection of two lists.
    list(set(list1) & set(list2)) is indeed one way to achieve this. [i
    for i in list1 if i in list2] is another one.

    Sigmund
    On May 15, 4:11?am, Chris Torek wrote:
    In article <871v00j2bh.... at benfinney.id.au>
    Ben Finney ?wrote:
    As pointed out: you already know how to create a set from an object;
    creating a list from an object is very similar:
    ? ?list(set(aa))
    But why are you doing that? What are you trying to achieve?
    I have no idea why someone *else* is doing that, but I have used
    this very expression to unique-ize a list:

    ? ? >>> x = [3, 1, 4, 1, 5, 9, 2, 6]
    ? ? >>> x
    ? ? [3, 1, 4, 1, 5, 9, 2, 6]
    ? ? >>> list(set(x))
    ? ? [1, 2, 3, 4, 5, 6, 9]
    ? ? >>>

    Of course, this trick only works if all the list elements are
    hashable.

    This might not be the best example since the result is sorted
    "by accident", while other list(set(...)) results are not. ?Add
    sorted() or .sort() if needed:

    ? ? >>> x = ['three', 'one', 'four', 'one', 'five']
    ? ? >>> x
    ? ? ['three', 'one', 'four', 'one', 'five']
    ? ? >>> list(set(x))
    ? ? ['four', 'five', 'three', 'one']
    ? ? >>> sorted(list(set(x)))
    ? ? ['five', 'four', 'one', 'three']
    ? ? >>>
    --
    In-Real-Life: Chris Torek, Wind River Systems
    Salt Lake City, UT, USA (40?39.22'N, 111?50.29'W) ?+1 801 277 2603
    email: gmail (figure it out) ? ? ?http://web.torek.net/torek/index.html
  • SigmundV at May 15, 2011 at 11:23 am
    I'm sorry I top posted. I'll remember not to top post next time.

    Sigmund
  • TheSaint at May 15, 2011 at 3:56 pm

    SigmundV wrote:

    I think the OP wants to find the intersection of two lists.
    list(set(list1) & set(list2)) is indeed one way to achieve this. [i
    for i in list1 if i in list2] is another one
    Exactly. I was confused on that I wasn't able to have a list in return.
    The set intersection is the smartest result better than a "for" loop or a
    comprehension list.
    Infact the operatin loops are compiled into python, therfore they are the
    fastest.
    --
    goto /dev/null
  • Thomas Rachel at May 15, 2011 at 8:27 pm

    Am 15.05.2011 17:56 schrieb TheSaint:
    SigmundV wrote:
    I think the OP wants to find the intersection of two lists.
    list(set(list1)& set(list2)) is indeed one way to achieve this. [i
    for i in list1 if i in list2] is another one
    Exactly. I was confused on that I wasn't able to have a list in return.
    The set intersection is the smartest result better than a "for" loop or a
    comprehension list.
    I'm not sure about if it is really the smartest way.

    s=set(list2); [i for i in list1 if i in s]
    is in the same order of magnitude as the set operation. Both solutions
    seem to be equivalent in that concerns the number of needed loop runs,
    but this two-step operation might require one less loop over list1.

    The set&set solution, in contrary, might require one loop while
    transforming to a set and another one for the & operation.

    Infact the operatin loops are compiled into python, therfore they are the
    fastest.
    Which loops do you mean here?


    Thomas
  • Daniel Kluev at May 16, 2011 at 2:37 am

    Both solutions seem to be equivalent in that concerns the number of needed loop runs, but this two-step operation might require one less loop over list1.
    The set&set solution, in contrary, might require one loop while transforming to a set and another one for the & operation.
    python -m timeit -s "l1 = range(1, 10000); l2 = range(5000, 15000)"
    "l3 = list(set(l1) & set(l2))"
    100 loops, best of 3: 2.19 msec per loop

    python -m timeit -s "l1 = range(1, 10000); l2 = range(5000, 15000)"
    "s=set(l2); l3 = [i for i in l1 if i in s]"
    100 loops, best of 3: 2.45 msec per loop

    python -m timeit -s "l1 = range(1, 100000); l2 = range(50000, 150000)"
    "l3 = list(set(l1) & set(l2))"
    10 loops, best of 3: 28 msec per loop

    python -m timeit -s "l1 = range(1, 100000); l2 = range(50000, 150000)"
    "s=set(l2); l3 = [i for i in l1 if i in s]"
    10 loops, best of 3: 28.1 msec per loop

    So even with conversion back into list set&set is still marginally faster.

    --
    With best regards,
    Daniel Kluev
  • Peter Otten at May 16, 2011 at 6:34 am

    Daniel Kluev wrote:

    Both solutions seem to be equivalent in that concerns the number of
    needed loop runs, but this two-step operation might require one less loop
    over list1. The set&set solution, in contrary, might require one loop
    while transforming to a set and another one for the & operation.
    python -m timeit -s "l1 = range(1, 10000); l2 = range(5000, 15000)"
    "l3 = list(set(l1) & set(l2))"
    100 loops, best of 3: 2.19 msec per loop

    python -m timeit -s "l1 = range(1, 10000); l2 = range(5000, 15000)"
    "s=set(l2); l3 = [i for i in l1 if i in s]"
    100 loops, best of 3: 2.45 msec per loop

    python -m timeit -s "l1 = range(1, 100000); l2 = range(50000, 150000)"
    "l3 = list(set(l1) & set(l2))"
    10 loops, best of 3: 28 msec per loop

    python -m timeit -s "l1 = range(1, 100000); l2 = range(50000, 150000)"
    "s=set(l2); l3 = [i for i in l1 if i in s]"
    10 loops, best of 3: 28.1 msec per loop

    So even with conversion back into list set&set is still marginally faster.
    If you are looking for speed, consider

    s = set(l1)
    s.intersection_update(l2)
    l3 = list(s)

    $ python -m timeit -s "l1 = range(1, 10000); l2 = range(5000, 15000)"
    "list(set(l1) & set(l2))"
    100 loops, best of 3: 4 msec per loop

    $ python -m timeit -s "l1 = range(1, 10000); l2 = range(5000, 15000)" "s =
    set(l1); s.intersection_update(l2); list(s)"
    100 loops, best of 3: 1.99 msec per loop
  • TheSaint at May 16, 2011 at 2:23 pm

    Thomas Rachel wrote:

    Which loops do you mean here?
    list(set) has been proved to largely win against
    list = []
    for item in set:
    list.append(item)
    or [list.append(item) for item in set]

    --
    goto /dev/null
  • Ben Finney at May 17, 2011 at 12:33 am

    TheSaint <nobody at nowhere.net.no> writes:

    Thomas Rachel wrote:
    Which loops do you mean here?
    list(set) has been proved to largely win against
    list = []
    for item in set:
    list.append(item)
    or [list.append(item) for item in set]
    Remember that the criterion of speed is a matter of the implementation,
    and what's fast on one won't necessarily be fast on others. Which
    implementations did you try?

    Where I do agree is that ?list(foo)? wins over the other examples you
    show on the important criteria of concision and readability.

    --
    \ ?A thing moderately good is not so good as it ought to be. |
    `\ Moderation in temper is always a virtue; but moderation in |
    _o__) principle is always a vice.? ?Thomas Paine |
    Ben Finney
  • Roy Smith at May 15, 2011 at 5:07 pm
    In article
    <34fc571c-f382-405d-94b1-0a673da5f46b at t16g2000vbi.googlegroups.com>,
    SigmundV wrote:
    I think the OP wants to find the intersection of two lists.
    list(set(list1) & set(list2)) is indeed one way to achieve this. [i
    for i in list1 if i in list2] is another one.
    Both ways work, but the first is O(n) and the second is O(n^2).

    import time
    n = 10000
    list1 = range(n)
    list2 = range(n)
    t0 = time.time()
    list(set(list1) & set(list2))
    t1 = time.time()
    print "list(set) method took %f seconds" % (t1 - t0)
    t0 = time.time()
    [i for i in list1 if i in list2]
    t1 = time.time()
    print "loop method took %f seconds" % (t1 - t0)


    ./intersect.py 100000
    list(set) method took 0.004791 seconds
    loop method took 1.437322 seconds
  • TheSaint at May 15, 2011 at 4:05 pm

    Chris Torek wrote:

    x = ['three', 'one', 'four', 'one', 'five']
    x
    ['three', 'one', 'four', 'one', 'five']
    list(set(x))
    ['four', 'five', 'three', 'one']
    Why one *"one"* has purged out?
    Removing double occurences in a list?
    --
    goto /dev/null
  • Steven D'Aprano at May 15, 2011 at 4:28 pm

    On Mon, 16 May 2011 00:05:44 +0800, TheSaint wrote:

    Chris Torek wrote:
    x = ['three', 'one', 'four', 'one', 'five'] x
    ['three', 'one', 'four', 'one', 'five']
    list(set(x))
    ['four', 'five', 'three', 'one']
    Why one *"one"* has purged out?
    Removing double occurences in a list?
    Break the operation up into two steps instead of one:

    x = ['three', 'one', 'four', 'one', 'five']
    s = set(x)
    print s
    set(['four', 'five', 'three', 'one'])
    list(s)
    ['four', 'five', 'three', 'one']


    Once an element is already in a set, adding it again is a null-op:

    s = set()
    s.add(42)
    s.add(42)
    s.add(42)
    print s
    set([42])




    --
    Steven
  • TheSaint at May 15, 2011 at 4:35 pm

    Steven D'Aprano wrote:

    s = set()
    s.add(42)
    s.add(42)
    s.add(42)
    print s
    set([42])
    Good to know. I'll remember it

    --
    goto /dev/null
  • Duncan Booth at May 16, 2011 at 10:24 am

    Chris Torek wrote:

    x = [3, 1, 4, 1, 5, 9, 2, 6]
    x
    [3, 1, 4, 1, 5, 9, 2, 6]
    list(set(x))
    [1, 2, 3, 4, 5, 6, 9]
    Of course, this trick only works if all the list elements are
    hashable.

    This might not be the best example since the result is sorted
    "by accident", while other list(set(...)) results are not.
    A minor change to your example makes it out of order even for integers:
    x = [7, 8, 9, 1, 4, 1]
    list(set(x))
    [8, 9, 1, 4, 7]

    or for that mattter:
    list(set([3, 32, 4, 32, 5, 9, 2, 6]))
    [32, 2, 3, 4, 5, 6, 9]
  • Chris Torek at May 17, 2011 at 1:07 am

    Chris Torek wrote:
    x = [3, 1, 4, 1, 5, 9, 2, 6]
    list(set(x))
    This might not be the best example since the result is sorted
    "by accident", while other list(set(...)) results are not.
    In article <Xns9EE772D313153duncanbooth at 127.0.0.1>,
    Duncan Booth wrote:
    A minor change to your example makes it out of order even for integers:
    x = [7, 8, 9, 1, 4, 1]
    list(set(x))
    [8, 9, 1, 4, 7]

    or for that mattter:
    list(set([3, 32, 4, 32, 5, 9, 2, 6]))
    [32, 2, 3, 4, 5, 6, 9]
    Yes, but then it is no longer "as easy as pi". :-)
    --
    In-Real-Life: Chris Torek, Wind River Systems
    Salt Lake City, UT, USA (40?39.22'N, 111?50.29'W) +1 801 277 2603
    email: gmail (figure it out) http://web.torek.net/torek/index.html
  • TheSaint at May 14, 2011 at 2:14 pm

    Peter Otten wrote:

    mylist = list(myset)
    Do you notice the similarity to converting a list to a set?
    There was something confusing me yesterday in doing that, but (for me
    strangely) I got cleared out.

    The point was that after a result from:

    newset= set(myset1) & set(myset2)
    list= [newset]

    << [{'bla', 'alb', 'lab'}]

    Probably list(set) is not like [set].

    --
    goto /dev/null
  • Chris Angelico at May 14, 2011 at 6:22 pm

    On Sun, May 15, 2011 at 12:14 AM, TheSaint wrote:
    newset= set(myset1) & set(myset2)
    list= [newset]

    << [{'bla', 'alb', 'lab'}]

    Probably list(set) is not like [set].
    list(set) creates a list out of the set. [set] creates a list with one
    element, the set itself. It's not a copy of the set, it's another
    reference to the same set; change one and you'll see the change in the
    other.

    Chris Angelico

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedMay 14, '11 at 9:02a
activeMay 17, '11 at 1:07a
posts22
users11
websitepython.org

People

Translate

site design / logo © 2023 Grokbase