Короткий код Python, чтобы сказать «Выберите меньшее значение»? - PullRequest
17 голосов
/ 11 января 2009

Что я имею в виду, Я ищу действительно короткий код, который возвращает нижнее значение. например:

a=[1,2,3,4,5,6,7,8,9,10]
b=[1,2,3,4,5,6,7,8]
len(a) = 10
len(b) = 8
if (fill-this-in):
     print(lesser-value)

И я забыл добавить, что если b меньше, чем a, я хочу, чтобы b вернул - не len (b) - переменную b.

Ответы [ 8 ]

34 голосов
/ 11 января 2009
print(min(a, b))
28 голосов
/ 11 января 2009

Вы не совсем ясно, что вы хотите, поэтому некоторые альтернативы. Учитывая следующие два списка:

a = [1,2,3,4,5,6,7,8,9,10]
b = [1,2,3,4,5,6,7,8]

Чтобы распечатать кратчайший список, вы можете просто сделать ..

>>> print(min(a, b))
[1, 2, 3, 4, 5, 6, 7, 8]

Чтобы получить самую короткую длину в виде числа, вы можете либо min len() каждого списка, либо сделать len(min()) (оба идентичных, выберите, какой из них вы найдете наиболее читабельным) ..

>>> print(min( len(a), len(b) ))
# or..
>>> print(len( min(a, b) ))
8

Чтобы напечатать самое низкое значение в любом списке, вы можете предоставить список в качестве единственного аргумента для min()

>>> a.extend(b) # Appends b to a
>>> print a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8]
>>> print(min(a))
1

Наконец, еще одна возможность, список, который имеет наименьшие значения в сумме:

>>> max( sum(a), sum(b) )
55

Чтобы напечатать фактический список с наибольшим sum(), вы можете использовать троичный оператор, например ..

>>> print a if sum(a) > sum(b) else b
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

.. хотя мне это никогда не нравилось (или не использовало), вместо этого я использовал более длинные, регулярные выражения if / else ..

>>> if sum(a) > sum(b):
...     print a
... else:
...     print b
... 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
5 голосов
/ 11 января 2009

Если длина списка делает его меньшим (не его значения), то вы действительно хотите:

min(a, b, key=len)

, что только случайно эквивалентно

min(a, b)

в данном примере.

4 голосов
/ 11 января 2009

min() должен выполнить то, что вам нужно

print(min(a,b))
1 голос
/ 02 ноября 2016

Кажется, этот ответ может устареть. У меня был тот же вопрос и я нашел ответ, но не получил ожидаемых результатов. Оказывается, Мин не возвращает автоматически короткий из двух списков (в 2.7). Чтобы получить это, вы должны использовать аргумент «ключ» (введен в 2.5) (выделение добавлено):

min (повторяемый [, ключ]) min (arg1, arg2, * args [, ключ]) Возвращает наименьшее элемент в итерируемом или наименьшем из двух или более аргументов.

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

Необязательный ключевой аргумент задает функцию упорядочения с одним аргументом. как это используется для list.sort (). Ключевой аргумент, если он указан, должен быть в форме ключевого слова (например, min (a, b, c, key = func)).

Изменено в версии 2.5: добавлена ​​поддержка необязательного ключевого аргумента

Так что в этом примере, хотя он, кажется, работает (и все еще будет работать в 2.7), он работает только потому, что список целых чисел одинаков. Однако, если это были два разных неупорядоченных списка, то:

min(a,b) 

вернет список с самым низким первым целым числом.

Чтобы получить более короткий список из двух списков, используйте:

min(a,b, key=len)
1 голос
/ 14 января 2009

Heads, min(a, b, key=len) работает только в Python 2.5 и выше, я думаю.

(это не работает на моем MacBook с Python 2.4, но мой Linux-сервер с 2.5 в порядке)

0 голосов
/ 11 января 2009

Это то, что вы хотите?

if len(a) < len(b):
    print a
else:
    print b

В качестве альтернативы, если вы хотите использовать троичный оператор, такой как @Andrew G. Johnson:

print a if len(a) < len(b) else b

PS. Помните, что Python не использует фигурные скобки для своих блоков, и что его троичный оператор отличается от языков, подобных C.

0 голосов
/ 11 января 2009

Я не знаю Python, но для чего-то подобного я бы использовал троичный оператор.

print(length(a) < length(b) ? length(a) : length(b))

Стоит отметить, что, если они равны, будет напечатана длина (b)

...