Saykat
Saykat

Reputation: 124

How to merge the inner list of a 2d list in python

I have a 2d list like this:

[['dragon', 11], ['dragon', 111], ['stage_1', 1], ['stage_1', 2], ['stage_2', 10], ['stage_2', 12]].

I want it to look like this:

[['dragon', [11, 111]], ['stage_1', [1, 2]], ['stage_2', [10, 12]]]

Upvotes: 0

Views: 143

Answers (3)

DarrylG
DarrylG

Reputation: 17156

For your 2d list structure you can use zip and list comprehension

lst = [['dragon', 11], ['dragon', 111], ['stage_1', 1], ['stage_1', 2], ['stage_2', 10], ['stage_2', 12]]

k, v = zip(*lst)
result = [[k[i], v[i:i+2]]  for i in range(0, len(k), 2)]
print(result)

Output

[['dragon', (11, 111)], ['stage_1', (1, 2)], ['stage_2', (10, 12)]]

Performance Comparison

1. List Comprehension/Zip

    k, v = zip(*lst)
    result = [[k[i], v[i:i+2]]  for i in range(0, len(k), 2)]

    100000 loops, best of 3: 3.72 µs per loop (using timeit)

2. Dictionary

d = defaultdict(list)
for k, v in lst:
    d[k].append(v)
groups = list(map(list, d.items()))

100000 loops, best of 3: 5.85 µs per loop (using timeit)

Results: List comprehension ~57% faster

Upvotes: 1

RomanPerekhrest
RomanPerekhrest

Reputation: 92854

With collections.defaultdict object:

from collections import defaultdict

lst = [['dragon', 11], ['dragon', 111], ['stage_1', 1], ['stage_1', 2], ['stage_2', 10], ['stage_2', 12]]
d = defaultdict(list)

for k, v in lst:
    d[k].append(v)
groups = list(map(list, d.items()))

print(groups)

The output:

[['dragon', [11, 111]], ['stage_1', [1, 2]], ['stage_2', [10, 12]]]

Upvotes: 1

Dev Khadka
Dev Khadka

Reputation: 5451

I think it is better to use dictionary for your case like below

d = { }
for key,value in ls:
    d[key] = d.get(key, []) + [value]

print(d)

you can use d.items() to get list of tuples if you need list

Upvotes: 0

Related Questions