Converting a list of tuples into a dict
Question:
I have a list of tuples like this:
[
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]
I want to iterate through this keying by the first item, so, for example, I could print something like this:
a 1 2 3
b 1 2
c 1
How would I go about doing this without keeping an item to track whether the first item is the same as I loop around the tuples? This feels rather messy (plus I have to sort the list to start with)…
Answers:
l = [
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]
d = {}
for x, y in l:
d.setdefault(x, []).append(y)
print d
produces:
{'a': [1, 2, 3], 'c': [1], 'b': [1, 2]}
Slightly simpler…
from collections import defaultdict
fq = defaultdict(list)
for n, v in myList:
fq[n].append(v)
print(fq) # defaultdict(<type 'list'>, {'a': [1, 2, 3], 'c': [1], 'b': [1, 2]})
A solution using groupby
from itertools import groupby
l = [('a',1), ('a', 2),('a', 3),('b', 1),('b', 2),('c', 1),]
[(label, [v for l,v in value]) for (label, value) in groupby(l, lambda x:x[0])]
Output:
[('a', [1, 2, 3]), ('b', [1, 2]), ('c', [1])]
groupby(l, lambda x:x[0])
gives you an iterator that contains
['a', [('a', 1), ...], c, [('c', 1)], ...]
I would just do the basic
answer = {}
for key, value in list_of_tuples:
if key in answer:
answer[key].append(value)
else:
answer[key] = [value]
If it’s this short, why use anything complicated. Of course if you don’t mind using setdefault that’s okay too.
Print list of tuples grouping by the first item
This answer is based on the @gommen one.
#!/usr/bin/env python
from itertools import groupby
from operator import itemgetter
L = [
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]
key = itemgetter(0)
L.sort(key=key) #NOTE: use `L.sort()` if you'd like second items to be sorted too
for k, group in groupby(L, key=key):
print k, ' '.join(str(item[1]) for item in group)
Output:
a 1 2 3
b 1 2
c 1
I have a list of tuples like this:
[
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]
I want to iterate through this keying by the first item, so, for example, I could print something like this:
a 1 2 3
b 1 2
c 1
How would I go about doing this without keeping an item to track whether the first item is the same as I loop around the tuples? This feels rather messy (plus I have to sort the list to start with)…
l = [
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]
d = {}
for x, y in l:
d.setdefault(x, []).append(y)
print d
produces:
{'a': [1, 2, 3], 'c': [1], 'b': [1, 2]}
Slightly simpler…
from collections import defaultdict
fq = defaultdict(list)
for n, v in myList:
fq[n].append(v)
print(fq) # defaultdict(<type 'list'>, {'a': [1, 2, 3], 'c': [1], 'b': [1, 2]})
A solution using groupby
from itertools import groupby
l = [('a',1), ('a', 2),('a', 3),('b', 1),('b', 2),('c', 1),]
[(label, [v for l,v in value]) for (label, value) in groupby(l, lambda x:x[0])]
Output:
[('a', [1, 2, 3]), ('b', [1, 2]), ('c', [1])]
groupby(l, lambda x:x[0])
gives you an iterator that contains
['a', [('a', 1), ...], c, [('c', 1)], ...]
I would just do the basic
answer = {} for key, value in list_of_tuples: if key in answer: answer[key].append(value) else: answer[key] = [value]
If it’s this short, why use anything complicated. Of course if you don’t mind using setdefault that’s okay too.
Print list of tuples grouping by the first item
This answer is based on the @gommen one.
#!/usr/bin/env python
from itertools import groupby
from operator import itemgetter
L = [
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]
key = itemgetter(0)
L.sort(key=key) #NOTE: use `L.sort()` if you'd like second items to be sorted too
for k, group in groupby(L, key=key):
print k, ' '.join(str(item[1]) for item in group)
Output:
a 1 2 3
b 1 2
c 1