'How to find the largest number(s) in a list of elements, possibly non-unique?
Here is my program,
item_no = []
max_no = 0
for i in range(5):
input_no = int(input("Enter an item number: "))
item_no.append(input_no)
for no in item_no:
if no > max_no:
max_no = no
high = item_no.index(max_no)
print (item_no[high])
Example input: [5, 6, 7, 8, 8]
Example output: 8
How can I change my program to output the same highest numbers in an array?
Expected output: [8, 8]
Solution 1:[1]
Just get the maximum using max
and then its count
and combine the two in a list-comprehension.
item_no = [5, 6, 7, 8, 8]
max_no = max(item_no)
highest = [max_no for _ in range(item_no.count(max_no))]
print(highest) # -> [8, 8]
Note that this will return a list of a single item in case your maximum value appears only once.
A solution closer to your current programming style would be the following:
item_no = [5, 6, 7, 8, 8]
max_no = 0 # Note 1
for i in item_no:
if i > max_no:
max_no = i
high = [i]
elif i == max_no:
high.append(i)
with the same results as above of course.
Notes
- I am assuming that you are dealing with N* (1, 2, ...) numbers only. If that is not the case, initializing with
-math.inf
should be used instead.
Note that the second code snippet is less efficient than the first by quite a margin. Python allows you to be more efficient than these explicit, fortran-like loops and it is more efficient itself when you use it properly.
Solution 2:[2]
You can do it even shorter:
item_no = [5, 6, 7, 8, 8]
#compute once - use many times
max_item = max(item_no)
print(item_no.count(max_item) * [max_item])
Output:
[8, 8]
Solution 3:[3]
You could use list
comprehension for that task following way:
numbers = [5, 6, 7, 8, 8]
maxnumbers = [i for i in numbers if i==max(numbers)]
print(*maxnumbers,sep=',')
output:
8,8
*
operator in print
is used to unpack values, sep
is used to inform print
what seperator to use: ,
in this case.
EDIT: If you want to get indices of biggest value and call max
only once then do:
numbers = [5, 6, 7, 8, 8]
biggest = max(numbers)
positions = [inx for inx,i in enumerate(numbers) if i==biggest]
print(*positions,sep=',')
Output:
3,4
As you might check numbers[3]
is equal to biggest
and numbers[4]
is equal to biggest
.
Solution 4:[4]
Count the occurrence of max number
iterate over the list to print the max number for the range of the count (1)
Hence:
item_no = [5, 6, 7, 8, 8]
counter = item_no.count(max(item_no)) # 2
print([max(item_no) for x in range(counter)])
OUTPUT:
[8, 8]
Solution 5:[5]
This issue can be solved in one line, by finding an item which is equal to the maximum value:
To improve performance store max in var
Mvalue=max(item_no)
[i for i in item_no if i==Mvalue]
Solution 6:[6]
I think it would be better if we evaluate the max
in the array and its count
in one iteration
def maxs(iterable):
max = None
count = 0
for index, value in enumerate(iterable):
if index == 0 or value >= max:
if value != max:
count = 0
max = value
count += 1
return count * [max]
print (maxs([5, 6, 7, 8, 8])) # [8, 8]
print (maxs([3, 2, 4, 5, 1, 2, 4, 5, 2, 5, 0])) # [5, 5, 5]
print (maxs([])) # []
Give it a Try!!
Solution 7:[7]
I think there is no possible way to find all max numbers with just a single line BUT it will kinda work with this first of all we will sort the list in ascending then do this
yourList = [7,7,76,4,54,4,5,234,5,56,7,234,34,234,234]
yourList.sort()
ind = yourList.index(max(yourList))
for i in range(ind,ind+(len(yourList)-ind)):
print(yourList[i])
in this basically we will get the index of the first max number then we will subtract it by the lenght of the list and we will get how many indexes to plus to get all the max digits
OR
there is one another way to do it in this way
lis = [1,2,3,12,12,1,12,3,4,5,6,12, 12]
count = lis.count(max(lis))
loop = [print(max(lis), end=" ") for i in range(count)]
in this way we will get how many times the max number has occurred in the list and print it that many time
Solution 8:[8]
If you want to do without using inbuilt function and stick to your way then below is useful
item_no = [0,5,6,2,6,5,6,7,8,1,2,8]
max_no = 0
list = []
for no in item_no:
if no==max_no:
list.append(no) #append the list with the new number
elif no > max_no:
max_no = no
list=[no] # reset the list with new highest number
print(list)--->output[8,8]
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | |
Solution 3 | |
Solution 4 | DirtyBit |
Solution 5 | |
Solution 6 | Grijesh Chauhan |
Solution 7 | |
Solution 8 | Network Assasin |