Create a dictionary with list comprehension

前端 未结 14 2023
灰色年华
灰色年华 2020-11-21 07:07

I like the Python list comprehension syntax.

Can it be used to create dictionaries too? For example, by iterating over pairs of keys and values:

mydi         


        
相关标签:
14条回答
  • 2020-11-21 08:01

    In fact, you don't even need to iterate over the iterable if it already comprehends some kind of mapping, the dict constructor doing it graciously for you:

    >>> ts = [(1, 2), (3, 4), (5, 6)]
    >>> dict(ts)
    {1: 2, 3: 4, 5: 6}
    >>> gen = ((i, i+1) for i in range(1, 6, 2))
    >>> gen
    <generator object <genexpr> at 0xb7201c5c>
    >>> dict(gen)
    {1: 2, 3: 4, 5: 6}
    
    0 讨论(0)
  • 2020-11-21 08:04

    Python version < 2.7(RIP, 3 July 2010 - 31 December 2019), do the below:

    d = dict((i,True) for i in [1,2,3])
    

    Python version >= 2.7, do the below:

    d = {i: True for i in [1,2,3]}
    
    0 讨论(0)
  • 2020-11-21 08:05

    Create a dictionary with list comprehension in Python

    I like the Python list comprehension syntax.

    Can it be used to create dictionaries too? For example, by iterating over pairs of keys and values:

    mydict = {(k,v) for (k,v) in blah blah blah}
    

    You're looking for the phrase "dict comprehension" - it's actually:

    mydict = {k: v for k, v in iterable}
    

    Assuming blah blah blah is an iterable of two-tuples - you're so close. Let's create some "blahs" like that:

    blahs = [('blah0', 'blah'), ('blah1', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]
    

    Dict comprehension syntax:

    Now the syntax here is the mapping part. What makes this a dict comprehension instead of a set comprehension (which is what your pseudo-code approximates) is the colon, : like below:

    mydict = {k: v for k, v in blahs}
    

    And we see that it worked, and should retain insertion order as-of Python 3.7:

    >>> mydict
    {'blah0': 'blah', 'blah1': 'blah', 'blah2': 'blah', 'blah3': 'blah'}
    

    In Python 2 and up to 3.6, order was not guaranteed:

    >>> mydict
    {'blah0': 'blah', 'blah1': 'blah', 'blah3': 'blah', 'blah2': 'blah'}
    

    Adding a Filter:

    All comprehensions feature a mapping component and a filtering component that you can provide with arbitrary expressions.

    So you can add a filter part to the end:

    >>> mydict = {k: v for k, v in blahs if not int(k[-1]) % 2}
    >>> mydict
    {'blah0': 'blah', 'blah2': 'blah'}
    

    Here we are just testing for if the last character is divisible by 2 to filter out data before mapping the keys and values.

    0 讨论(0)
  • 2020-11-21 08:05
    >>> {k: v**3 for (k, v) in zip(string.ascii_lowercase, range(26))}
    

    Python supports dict comprehensions, which allow you to express the creation of dictionaries at runtime using a similarly concise syntax.

    A dictionary comprehension takes the form {key: value for (key, value) in iterable}. This syntax was introduced in Python 3 and backported as far as Python 2.7, so you should be able to use it regardless of which version of Python you have installed.

    A canonical example is taking two lists and creating a dictionary where the item at each position in the first list becomes a key and the item at the corresponding position in the second list becomes the value.

    The zip function used inside this comprehension returns an iterator of tuples, where each element in the tuple is taken from the same position in each of the input iterables. In the example above, the returned iterator contains the tuples (“a”, 1), (“b”, 2), etc.

    Output:

    {'i': 512, 'e': 64, 'o': 2744, 'h': 343, 'l': 1331, 's': 5832, 'b': 1, 'w': 10648, 'c': 8, 'x': 12167, 'y': 13824, 't': 6859, 'p': 3375, 'd': 27, 'j': 729, 'a': 0, 'z': 15625, 'f': 125, 'q': 4096, 'u': 8000, 'n': 2197, 'm': 1728, 'r': 4913, 'k': 1000, 'g': 216, 'v': 9261}

    0 讨论(0)
  • 2020-11-21 08:06

    Here is another example of dictionary creation using dict comprehension:

    What i am tring to do here is to create a alphabet dictionary where each pair; is the english letter and its corresponding position in english alphabet

    >>> import string
    >>> dict1 = {value: (int(key) + 1) for key, value in 
    enumerate(list(string.ascii_lowercase))}
    >>> dict1
    {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 
    'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 
    19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
    >>> 
    

    Notice the use of enumerate here to get a list of alphabets and their indexes in the list and swapping the alphabets and indices to generate the key value pair for dictionary

    Hope it gives a good idea of dictionary comp to you and encourages you to use it more often to make your code compact

    0 讨论(0)
  • 2020-11-21 08:07

    To add onto @fortran's answer, if you want to iterate over a list of keys key_list as well as a list of values value_list:

    d = dict((key, value) for (key, value) in zip(key_list, value_list))
    

    or

    d = {(key, value) for (key, value) in zip(key_list, value_list)}
    
    0 讨论(0)
提交回复
热议问题