Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python max with same number of instances

I have a list:

hello = ['1', '1', '2', '1', '2', '2', '7']

I wanted to display the most common element of the list, so I used:

m = max(set(hello), key=hello.count)

However, I realised that there could be two elements of the list that occur the same frequency, like the 1's and 2's in the list above. Max only outputs the first instance of a maximum frequency element.

What kind of command could check a list to see if two elements both have the maximum number of instances, and if so, output them both? I am at a loss here.

like image 326
james_kansas Avatar asked Apr 01 '12 01:04

james_kansas


People also ask

How do you find the maximum number of occurrences in Python?

Use max() to find the item with the maximum number of occurrences in a list. Call max(iterable, key=None) with iterable as a list and key set to list. count to return the item with the maximum number of occurrences in list .

How do you find the maximum number of repeated elements in a list in Python?

Method #1 : Using loop + count() In this, we perform iteration of elements and check if count is more than N of that element using count(), if yes, then we remove that element.

What does Max return if equal Python?

The max() function returns the largest of the input values. An iterable object like string, list, tuple etc. The default value to return if the iterable is empty. It refers to the single argument function to customize the sort order.

Can Max function return multiple values in Python?

As we stated earlier, the Python max() method can also return the largest of multiple iterable elements as arguments. These arguments can be iterable like string, character, tuple, list or etc..


3 Answers

Using an approach similar to your current, you would first find the maximum count and then look for every item with that count:

>>> m = max(map(hello.count, hello))
>>> set(x for x in hello if hello.count(x) == m)
set(['1', '2'])

Alternatively, you can use the nice Counter class, which can be used to efficiently, well, count stuff:

>>> hello = ['1', '1', '2', '1', '2', '2', '7']
>>> from collections import Counter
>>> c = Counter(hello)
>>> c
Counter({'1': 3, '2': 3, '7': 1})
>>> common = c.most_common()
>>> common
[('1', 3), ('2', 3), ('7', 1)]

Then you can use a list comprehension to get all the items that have the maximum count:

>>> set(x for x, count in common if count == common[0][1])
set(['1', '2'])
like image 180
Niklas B. Avatar answered Oct 12 '22 23:10

Niklas B.


Edit: Changed solution

>>> from collections import Counter
>>> from itertools import groupby
>>> hello = ['1', '1', '2', '1', '2', '2', '7']
>>> max_count, max_nums = next(groupby(Counter(hello).most_common(),
                               lambda x: x[1]))
>>> print [num for num, count in max_nums]
['1', '2']
like image 34
jamylak Avatar answered Oct 13 '22 00:10

jamylak


from collections import Counter

def myFunction(myDict):
    myMax = 0 # Keep track of the max frequence
    myResult = [] # A list for return

    for key in myDict:
        print('The key is', key, ', The count is', myDict[key])
        print('My max is:', myMax)
        # Finding out the max frequence
        if myDict[key] >= myMax:
            if myDict[key] == myMax:
                myMax = myDict[key]
                myResult.append(key)
            # Case when it is greater than, we will delete and append
            else:
                myMax = myDict[key]
                del myResult[:]
                myResult.append(key)
    return myResult

foo = ['1', '1', '5', '2', '1', '6', '7', '10', '2', '2']
myCount = Counter(foo)
print(myCount)

print(myFunction(myCount))

Output:

The list: ['1', '1', '5', '2', '1', '6', '7', '10', '2', '2']
Counter({'1': 3, '2': 3, '10': 1, '5': 1, '7': 1, '6': 1})
The key is 10 , The count is 1
My max is: 0
The key is 1 , The count is 3
My max is: 1
The key is 2 , The count is 3
My max is: 3
The key is 5 , The count is 1
My max is: 3
The key is 7 , The count is 1
My max is: 3
The key is 6 , The count is 1
My max is: 3
['1', '2']

I wrote this simple program, I think it might also work. I was not aware of the most_common() function until I do a search. I think this will return as many most frequent element there is, it works by comparing the max frequent element, when I see a more frequent element, it will delete the result list, and append it once; or if it is the same frequency, it simply append to it. And keep going until the whole Counter is iterated through.

like image 27
George Avatar answered Oct 13 '22 00:10

George