Reputation: 124
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
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
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
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