可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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]
回答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.
回答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]
回答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
.
回答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]
回答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]
回答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!!