Почему max (* list) и max (list) делают одно и то же в python? - PullRequest
0 голосов
/ 12 сентября 2018

См. Пример ниже:

>>>f = [[1],[2],[3]]
>>>max(f)
Out[21]: [3]
>>>max(*f)
Out[22]: [3]

Оператор распаковки здесь не имел никакого эффекта, я пытаюсь распаковать список и получить максимальное значение матрицы (двухцветный список).

Ответы [ 6 ]

0 голосов
/ 12 сентября 2018

Дано:

mat=[
    [1, 2, 3],
    [4, 5, 6],
    [0, 9, 10]
]

Либо max(mat), либо max(*mat) даст тот же результат, поскольку сравниваются отдельные подсписки:

>>> max(mat)
[4, 5, 6]
>>> max(*mat)
[4, 5, 6]

В первом случае, max(mat), у вас есть повторяемый список списков, возвращающий каждый подсписок по одному за раз. Во втором случае, max(*mat), элементы (подсписки) в этом списке списков распаковываются в несколько отдельных аргументов для max.

Если вы хотите, чтобы подсписок содержал максимальное значение, используйте max в качестве ключевой функции:

>>> max(mat, key=max)
[0, 9, 10]

Если вам нужно индивидуальное максимальное значение в двумерной матрице, вы можете сгладить его:

>>> max(v for sl in mat for v in sl)
10

Или три max:

>>> max(max(mat,key=max))
10
0 голосов
/ 12 сентября 2018

Это потому, что max будет иметь три списка, а затем получить максимальный список, так что вы можете сделать sum для целочисленных списков:

>>> f=[[1],[2],[3]]
>>> max(sum(f,[]))
3
>>> 

Также с:

>>> print(max.__doc__)
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> value

With a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the largest argument.
>>>

Как сказано: «С двумя или более аргументами, верните наибольший аргумент.»

Или можно использовать, reduce:

>>> from functools import reduce
>>> max(reduce(lambda x,y: x+y,f))
3
>>> 

даже похоже на ответ Безумного Физика, но вместо распаковки я использую .from_iterable:

>>> import itertools
>>> max(itertools.chain.from_iterable(f))
3
>>> 
0 голосов
/ 12 сентября 2018

help(max) должен быть вашим первым портом вызова.

Help on built-in function max in module builtins:

max(...)
    max(iterable, *[, default=obj, key=func]) -> value
    max(arg1, arg2, *args, *[, key=func]) -> value

    With a single iterable argument, return its biggest item. The
    default keyword-only argument specifies an object to return if
    the provided iterable is empty.
    With two or more arguments, return the largest argument.

max(f) означает max с одним аргументом, [[1],[2],[3]], и возвращается самый большой элемент этого.

max(*f) означает max с тремя аргументами, [1], [2], [3], и возвращается наибольшее из них.

Очевидно, что они эквивалентны в вашем примере.

Но в целомВы должны использовать первое, чтобы найти максимум повторяемого.Это правильный вариант использования.Последний прервется, например, на f = [1].

. Для вашей конкретной задачи вам нужно сгладить список списков в одну итерацию и передать его в max.Вот быстрый способ:

max(element for row in f for element in row)

0 голосов
/ 12 сентября 2018

В документации на max упоминается:

встроенный макс.

макс (итеративный, * [, ключ, по умолчанию])

max (arg1, arg2, * args [, ключ])

...

Если указан один позиционный аргумент, он должен быть итеративным. Самый большой элемент в итерируемом возвращается. Если указано два или более позиционных аргумента, возвращается самый большой из позиционных аргументов.

В первом случае у вас есть один позиционный аргумент, во втором случае у вас есть несколько.


Чтобы получить то, что вы хотите, то есть максимальную запись в матрице, которую вы можете попробовать

max(entry for row in matrix for entry in row)

Это передаст один аргумент функции max, которая является генератором, который перебирает все записи в матрице - запускает первый случай, который находит максимум итерируемого.

0 голосов
/ 12 сентября 2018

Вы можете поместить максимум каждого подсписка в список, а затем вызвать его максимум.

max(max(i) for i in f)
0 голосов
/ 12 сентября 2018

Вам нужно объединить списки в одну итерацию, чтобы это работало. itertools.chain позволит вам сделать это:

from itertools import chain

max(chain(*f))

Чтобы распаковать список без itertools или другого импорта, используйте вложенное понимание:

max(x for row in f for x in row)

max имеет два режима. Если вы передаете один позиционный аргумент, например, f, он будет интерпретирован как итеративный, и будет возвращен максимальный элемент итерируемого. Если вы передаете несколько аргументов позиции, например, *f, он найдет максимум этих элементов. Поскольку списки в Python сравнимы, обе версии действительно эквивалентны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...