Converting a list of tuples into a dict

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:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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]}

Method 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]})

Method 3

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)], ...]

Method 4

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.

Method 5

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


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x