Skip to content Skip to sidebar Skip to footer

Enumerate In Nested For Loop With List Comprehension In Python

I want to create a dictionary mapping all combinations of three groups to an integer. Is it possible to do this in a single line and without using any imports? With itertools it co

Solution 1:

You could enumerate the inner iterator like so:

>>> {x: i for i, x inenumerate(((c, s, z) for c in colours for s in shapes for z in sizes))}
{('red', 'circle', 'small'): 0,
 ('red', 'circle', 'medium'): 1,
 ('red', 'circle', 'large'): 2,
 ('red', 'square', 'small'): 3,
 ('red', 'square', 'medium'): 4,
 ('red', 'square', 'large'): 5,
 ('red', 'triangle', 'small'): 6,
 ('red', 'triangle', 'medium'): 7,
 ('red', 'triangle', 'large'): 8,
 ('green', 'circle', 'small'): 9,
 ('green', 'circle', 'medium'): 10,
 ('green', 'circle', 'large'): 11,
 ('green', 'square', 'small'): 12,
 ('green', 'square', 'medium'): 13,
 ('green', 'square', 'large'): 14,
 ('green', 'triangle', 'small'): 15,
 ('green', 'triangle', 'medium'): 16,
 ('green', 'triangle', 'large'): 17,
 ('blue', 'circle', 'small'): 18,
 ('blue', 'circle', 'medium'): 19,
 ('blue', 'circle', 'large'): 20,
 ('blue', 'square', 'small'): 21,
 ('blue', 'square', 'medium'): 22,
 ('blue', 'square', 'large'): 23,
 ('blue', 'triangle', 'small'): 24,
 ('blue', 'triangle', 'medium'): 25,
 ('blue', 'triangle', 'large'): 26}

To make the code slightly more readable:

{
    obj: index for index, obj inenumerate(
        (
            (color, shape, size) for color in colours
                                 for shape in shapes
                                 for size in sizes
        )
    )
}

Solution 2:

You can try:

lookup = {(c,s,z): i+3*j+9*k for i,c inenumerate(colours) for j,s inenumerate(shapes) for k,z inenumerate(sizes)}

Output:

{
('red', 'circle', 'small'): 0, 
('red', 'circle', 'medium'): 9, 
('red', 'circle', 'large'): 18, 
('red', 'square', 'small'): 3, 
('red', 'square', 'medium'): 12, 
('red', 'square', 'large'): 21, 
('red', 'triangle', 'small'): 6, 
('red', 'triangle', 'medium'): 15, 
('red', 'triangle', 'large'): 24, 
('green', 'circle', 'small'): 1, 
('green', 'circle', 'medium'): 10, 
('green', 'circle', 'large'): 19, 
('green', 'square', 'small'): 4, 
('green', 'square', 'medium'): 13, 
('green', 'square', 'large'): 22, 
('green', 'triangle', 'small'): 7, 
('green', 'triangle', 'medium'): 16, 
('green', 'triangle', 'large'): 25, 
('blue', 'circle', 'small'): 2, 
('blue', 'circle', 'medium'): 11, 
('blue', 'circle', 'large'): 20, 
('blue', 'square', 'small'): 5, 
('blue', 'square', 'medium'): 14, 
('blue', 'square', 'large'): 23, 
('blue', 'triangle', 'small'): 8, 
('blue', 'triangle', 'medium'): 17, 
('blue', 'triangle', 'large'): 26
}

And then in order to sort dict by value:

lookup=dict(sorted(lookup.items(), key=lambda x: x[1] ))

Post a Comment for "Enumerate In Nested For Loop With List Comprehension In Python"