Stagg
Stagg

Reputation: 309

Running through a list of tuples

I need to run through a list of tuples like this:

list = [('Abraham', 'Lisboa', 42195, '10-18', 2224),
('Mike', 'Nova Iorque', 42195, '06-13', 2319),
('Abraham', 'Toquio', 42195, '02-22', 2403),
('Mike', 'Sao Paulo', 21098, '04-12', 1182),
('Abraham', 'Sao Paulo', 21098, '04-12', 1096),
('Dora', 'Toquio', 42195, '02-22', 2449),
('Abraham', 'Boston', 42195, '04-20', 2187)]

My function (participations) needs to run through these tuples and count how many times does the first element of the tuples occurrs in general. For example:

participations(list)
>>>[4, 1, 2]

4 is the number of times that the element "Abraham" occurs, 1 is the number of times the element "Dora" occurs and 2 is the number of times the element "Mike" occurs. The participations in the final list must be in alphabetical order, following the names given.

Here is what I have so far:

def participations(list):
 result = []
 for i in list:
    for name in i[0]:
        result.append(name)
return result

But it's not giving me what I want, it only gives me the names with every letter separated from each other...

Feel free to ask any questions if you don't understand mine.

Hope you guys can help me, thanks in advance.

Upvotes: 0

Views: 100

Answers (2)

jDo
jDo

Reputation: 4010

No imports - just one line of list incomprehension :)

lst = [('Abraham', 'Lisboa', 42195, '10-18', 2224),
('Mike', 'Nova Iorque', 42195, '06-13', 2319),
('Abraham', 'Toquio', 42195, '02-22', 2403),
('Mike', 'Sao Paulo', 21098, '04-12', 1182),
('Abraham', 'Sao Paulo', 21098, '04-12', 1096),
('Dora', 'Toquio', 42195, '02-22', 2449),
('Abraham', 'Boston', 42195, '04-20', 2187)]

[[y[0] for y  in lst].count(z) for z in sorted(set([t[0] for t in lst]))]

Python 2.7.6 interpreter:

>>> [[y[0] for y  in lst].count(z) for z in sorted(set([t[0] for t in lst]))]
[4, 1, 2]
>>> 

If you want to count the number of occurrences of the first element in the entire tuple (as opposed to only considering the first element):

[[x for y in lst for x in y].count(z) for z in sorted(set([t[0] for t in lst]))]

Upvotes: 0

Ilja Everilä
Ilja Everilä

Reputation: 52929

Counting is best done by Counter in python:

from collections import Counter
from operator import itemgetter

data = [('Abraham', 'Lisboa', 42195, '10-18', 2224),
('Mike', 'Nova Iorque', 42195, '06-13', 2319),
('Abraham', 'Toquio', 42195, '02-22', 2403),
('Mike', 'Sao Paulo', 21098, '04-12', 1182),
('Abraham', 'Sao Paulo', 21098, '04-12', 1096),
('Dora', 'Toquio', 42195, '02-22', 2449),
('Abraham', 'Boston', 42195, '04-20', 2187)]

def participations(data):
    # You could use a generator expression too instead of a map:
    # Counter(d[0] for d in data)
    counts = Counter(map(itemgetter(0), data))
    return [counts[k] for k in sorted(counts.keys())]

print(participations(data))
[4, 1, 2]

Upvotes: 3

Related Questions