Pythonic way to combine FOR loop and IF statement

后端 未结 10 2330
暗喜
暗喜 2020-11-27 09:02

I know how to use both for loops and if statements on separate lines, such as:

>>> a = [2,3,4,5,6,7,8,9,0]
... xyz = [0,12,4,6,242,7,9]
... for x in         


        
相关标签:
10条回答
  • 2020-11-27 09:48

    You can use generators too, if generator expressions become too involved or complex:

    def gen():
        for x in xyz:
            if x in a:
                yield x
    
    for x in gen():
        print x
    
    0 讨论(0)
  • 2020-11-27 09:50

    You can use generator expressions like this:

    gen = (x for x in xyz if x not in a)
    
    for x in gen:
        print x
    
    0 讨论(0)
  • 2020-11-27 09:56

    I would probably use:

    for x in xyz: 
        if x not in a:
            print x...
    
    0 讨论(0)
  • 2020-11-27 09:56

    I liked Alex's answer, because a filter is exactly an if applied to a list, so if you want to explore a subset of a list given a condition, this seems to be the most natural way

    mylist = [1,2,3,4,5]
    another_list = [2,3,4]
    
    wanted = lambda x:x in another_list
    
    for x in filter(wanted, mylist):
        print(x)
    

    this method is useful for the separation of concerns, if the condition function changes, the only code to fiddle with is the function itself

    mylist = [1,2,3,4,5]
    
    wanted = lambda x:(x**0.5) > 10**0.3
    
    for x in filter(wanted, mylist):
        print(x)
    

    The generator method seems better when you don't want members of the list, but a modification of said members, which seems more fit to a generator

    mylist = [1,2,3,4,5]
    
    wanted = lambda x:(x**0.5) > 10**0.3
    
    generator = (x**0.5 for x in mylist if wanted(x))
    
    for x in generator:
        print(x)
    

    Also, filters work with generators, although in this case it isn't efficient

    mylist = [1,2,3,4,5]
    
    wanted = lambda x:(x**0.5) > 10**0.3
    
    generator = (x**0.9 for x in mylist)
    
    for x in filter(wanted, generator):
        print(x)
    

    But of course, it would still be nice to write like this:

    mylist = [1,2,3,4,5]
    
    wanted = lambda x:(x**0.5) > 10**0.3
    
    # for x in filter(wanted, mylist):
    for x in mylist if wanted(x):
        print(x)
    
    0 讨论(0)
  • 2020-11-27 09:57

    As per The Zen of Python (if you are wondering whether your code is "Pythonic", that's the place to go):

    • Beautiful is better than ugly.
    • Explicit is better than implicit.
    • Simple is better than complex.
    • Flat is better than nested.
    • Readability counts.

    The Pythonic way of getting the sorted intersection of two sets is:

    >>> sorted(set(a).intersection(xyz))
    [0, 4, 6, 7, 9]
    

    Or those elements that are xyz but not in a:

    >>> sorted(set(xyz).difference(a))
    [12, 242]
    

    But for a more complicated loop you may want to flatten it by iterating over a well-named generator expression and/or calling out to a well-named function. Trying to fit everything on one line is rarely "Pythonic".


    Update following additional comments on your question and the accepted answer

    I'm not sure what you are trying to do with enumerate, but if a is a dictionary, you probably want to use the keys, like this:

    >>> a = {
    ...     2: 'Turtle Doves',
    ...     3: 'French Hens',
    ...     4: 'Colly Birds',
    ...     5: 'Gold Rings',
    ...     6: 'Geese-a-Laying',
    ...     7: 'Swans-a-Swimming',
    ...     8: 'Maids-a-Milking',
    ...     9: 'Ladies Dancing',
    ...     0: 'Camel Books',
    ... }
    >>>
    >>> xyz = [0, 12, 4, 6, 242, 7, 9]
    >>>
    >>> known_things = sorted(set(a.iterkeys()).intersection(xyz))
    >>> unknown_things = sorted(set(xyz).difference(a.iterkeys()))
    >>>
    >>> for thing in known_things:
    ...     print 'I know about', a[thing]
    ...
    I know about Camel Books
    I know about Colly Birds
    I know about Geese-a-Laying
    I know about Swans-a-Swimming
    I know about Ladies Dancing
    >>> print '...but...'
    ...but...
    >>>
    >>> for thing in unknown_things:
    ...     print "I don't know what happened on the {0}th day of Christmas".format(thing)
    ...
    I don't know what happened on the 12th day of Christmas
    I don't know what happened on the 242th day of Christmas
    
    0 讨论(0)
  • 2020-11-27 09:59

    A simple way to find unique common elements of lists a and b:

    a = [1,2,3]
    b = [3,6,2]
    for both in set(a) & set(b):
        print(both)
    
    0 讨论(0)
提交回复
热议问题