iterating quickly through list of tuples

前端 未结 5 1668
清歌不尽
清歌不尽 2020-12-05 06:34

I wonder whether there\'s a quicker and less time consuming way to iterate over a list of tuples, finding the right match. What I do is:

# this is a very lon         


        
相关标签:
5条回答
  • 2020-12-05 06:47

    Assuming a bit more memory usage is not a problem and if the first item of your tuple is hashable, you can create a dict out of your list of tuples and then looking up the value is as simple as looking up a key from the dict. Something like:

    dct = dict(tuples)
    val = dct.get(key) # None if item not found else the corresponding value
    

    EDIT: To create a reverse mapping, use something like:

    revDct = dict((val, key) for (key, val) in tuples)
    
    0 讨论(0)
  • 2020-12-05 06:47

    The question is dead but still knowing one more way doesn't hurt:

    my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)]
    
    for first,*args in my_list:
        if first == Value:
            PAIR_FOUND = True
            MATCHING_VALUE = args
            break
    
    0 讨论(0)
  • 2020-12-05 06:52

    I think that you can use

    for j,k in my_list:
      [ ... stuff ... ]
    
    0 讨论(0)
  • 2020-12-05 06:55

    The code can be cleaned up, but if you are using a list to store your tuples, any such lookup will be O(N).

    If lookup speed is important, you should use a dict to store your tuples. The key should be the 0th element of your tuples, since that's what you're searching on. You can easily create a dict from your list:

    my_dict = dict(my_list)
    

    Then, (VALUE, my_dict[VALUE]) will give you your matching tuple (assuming VALUE exists).

    0 讨论(0)
  • 2020-12-05 07:10

    I wonder whether the below method is what you want.

    You can use defaultdict.

    >>> from collections import defaultdict
    >>> s = [('red',1), ('blue',2), ('red',3), ('blue',4), ('red',1), ('blue',4)]
    >>> d = defaultdict(list)
    >>> for k, v in s:
           d[k].append(v)    
    >>> sorted(d.items())
    [('blue', [2, 4, 4]), ('red', [1, 3, 1])]
    
    0 讨论(0)
提交回复
热议问题