Finding the index of an item in a list

后端 未结 30 3330
你的背包
你的背包 2020-11-21 05:28

Given a list [\"foo\", \"bar\", \"baz\"] and an item in the list \"bar\", how do I get its index (1) in Python?

30条回答
  •  执念已碎
    2020-11-21 05:49

    And now, for something completely different...

    ... like confirming the existence of the item before getting the index. The nice thing about this approach is the function always returns a list of indices -- even if it is an empty list. It works with strings as well.

    def indices(l, val):
        """Always returns a list containing the indices of val in the_list"""
        retval = []
        last = 0
        while val in l[last:]:
                i = l[last:].index(val)
                retval.append(last + i)
                last += i + 1   
        return retval
    
    l = ['bar','foo','bar','baz','bar','bar']
    q = 'bar'
    print indices(l,q)
    print indices(l,'bat')
    print indices('abcdaababb','a')
    

    When pasted into an interactive python window:

    Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54) 
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> def indices(the_list, val):
    ...     """Always returns a list containing the indices of val in the_list"""
    ...     retval = []
    ...     last = 0
    ...     while val in the_list[last:]:
    ...             i = the_list[last:].index(val)
    ...             retval.append(last + i)
    ...             last += i + 1   
    ...     return retval
    ... 
    >>> l = ['bar','foo','bar','baz','bar','bar']
    >>> q = 'bar'
    >>> print indices(l,q)
    [0, 2, 4, 5]
    >>> print indices(l,'bat')
    []
    >>> print indices('abcdaababb','a')
    [0, 4, 5, 7]
    >>> 
    

    Update

    After another year of heads-down python development, I'm a bit embarrassed by my original answer, so to set the record straight, one can certainly use the above code; however, the much more idiomatic way to get the same behavior would be to use list comprehension, along with the enumerate() function.

    Something like this:

    def indices(l, val):
        """Always returns a list containing the indices of val in the_list"""
        return [index for index, value in enumerate(l) if value == val]
    
    l = ['bar','foo','bar','baz','bar','bar']
    q = 'bar'
    print indices(l,q)
    print indices(l,'bat')
    print indices('abcdaababb','a')
    

    Which, when pasted into an interactive python window yields:

    Python 2.7.14 |Anaconda, Inc.| (default, Dec  7 2017, 11:07:58) 
    [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> def indices(l, val):
    ...     """Always returns a list containing the indices of val in the_list"""
    ...     return [index for index, value in enumerate(l) if value == val]
    ... 
    >>> l = ['bar','foo','bar','baz','bar','bar']
    >>> q = 'bar'
    >>> print indices(l,q)
    [0, 2, 4, 5]
    >>> print indices(l,'bat')
    []
    >>> print indices('abcdaababb','a')
    [0, 4, 5, 7]
    >>> 
    

    And now, after reviewing this question and all the answers, I realize that this is exactly what FMc suggested in his earlier answer. At the time I originally answered this question, I didn't even see that answer, because I didn't understand it. I hope that my somewhat more verbose example will aid understanding.

    If the single line of code above still doesn't make sense to you, I highly recommend you Google 'python list comprehension' and take a few minutes to familiarize yourself. It's just one of the many powerful features that make it a joy to use Python to develop code.

提交回复
热议问题