chungh
chungh

Reputation: 1

How do you count a tuple list and export the frequency of the variables into a dictionary?

I've been working on a solution for an assignment where we which accepts a list of tuple objects and returns a dictionary containing the frequency of all the strings that appear in the list

So I've been trying to use Counter from collections to count the frequency of a key that is occurring inside a tuple list

tuple_list = [('a',5), ('a',5), ('b',6), ('b',4), ('b',3), ('b',7)]

I can't get the Counter to only check for 'a' or 'b' or just the strings in the list.

from collections import Counter
def get_frequency(tuple_list): 
     C = Counter(new_list)
     print (C('a'), C('b')) 

 tuple_list = [('a',5), ('a',5), ('b',6), ('b',4), ('b',3), ('b',7)]
 freq_dict = get_frequency(tuple_list)
 for key in sorted(freq_dict.keys()):
    print("{}: {}".format(key, freq_dict[key]))

The output that I was expecting should be a: 2 b: 4 but I kept on getting a: 0 b: 0

Upvotes: 0

Views: 107

Answers (4)

GZ0
GZ0

Reputation: 4263

Another solution is to use zip and next to extract the first item of each tuple into a new tuple and feed it into Counter.

from collections import Counter
result = Counter(next(zip(*items)))

Upvotes: 0

Andrew Grass
Andrew Grass

Reputation: 252

Since you only want to count the first element (the string) in each tuple, you should only use the counter object on that first element as you can see in the get_frequency function below:

def get_frequency(tuple_list):
    cnt = Counter()
    for tuple_elem in tuple_list:
        cnt[tuple_elem[0]] += 1
    return cnt

tuple_list = [('a',5), ('a',5), ('b',6)]
freq_dict = get_frequency(tuple_list)

for key, value in freq_dict.items():
    print(f'{key}: {value}')

Also, make sure if you hope to receive a value from a function, you usually need to return a value using a return statement.

Hope that helps out!

Upvotes: 0

Anna Nevison
Anna Nevison

Reputation: 2759

if you don't want to use counter, you can just do the length of the lists like this...

unique_values = list(set([x[0] for x in tuple_list]))
a_dict = {}
for v in unique_values:
    a_dict[v] = len([x[1] for x in tuple_list if x[0] == v])

print(a_dict)

which gives you:

{'b': 4, 'a': 2}

Upvotes: 0

chris
chris

Reputation: 2063

Since the second (numeric) element in each tuple appears to be irrelevant, you need to pass in a sequence of the letters you're trying to count. Try a list comprehension:

>>> tuple_list = [('a',5), ('a',5), ('b',6), ('b',4), ('b',3), ('b',7)]
>>>
>>> items = [item[0] for item in tuple_list]
>>> items
['a', 'a', 'b', 'b', 'b', 'b']

>>> from collections import Counter
>>> c = Counter(items)
>>> print(c)
Counter({'b': 4, 'a': 2})

Upvotes: 1

Related Questions