简体   繁体   中英

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

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

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}

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!

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)))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM