Проверьте, равны ли все значения итерируемого нуля.

AFAIK, itemgetter не предоставляет такой режим. Вы можете, однако, определить свой собственный, используя, например, functools.partial и reduce:

>>> from functools import *
>>> deep_get = lambda *indices: partial(reduce, lambda x, i: x[i], indices)
>>> deep_get(1, 1)(out[0])
89
>>> sorted(out, key=deep_get(1, 1))
[(27, (56, 12, 88)),
 (71, (9, 22, 25)),
 (54, (35, 24, 93)),
 (98, (44, 31, 48)),
 (55, (37, 55, 44)),
 (65, (93, 58, 81)),
 (13, (25, 68, 78)),
 (14, (96, 70, 38)),
 (66, (50, 86, 15)),
 (33, (52, 89, 83))]

Обратите внимание, что это медленнее , чем ваш lambda, хотя, но может быть, более универсальный для различных уровней вложенности. Если речь идет только о скорости, вам следует просто заменить lambda на «правильную» функцию def get(x): return x[1][1], которая кажется такой же быстрой, как itemgetter (в моей системе сортировка out занимает 1,3 мкс с itemgetter (один уровень) или def get, 1,7 мкс с lambda и 3 мкс с deep_get).

def get(x): return x[1][1] # faster than lambda
sorted(out, key=get)
26
задан mjschultz 20 August 2010 в 15:59
поделиться

4 ответа

Используйте генераторы, а не списки в таких случаях:

all(v == 0 for v in values)

Редактировать:

all - стандартная встроенная функция Python. Если вы хотите быть эффективным программистом Python, вы должны знать, вероятно, более половины из них ( http://docs.python.org/library/functions.html ). Утверждать, что alltrue - лучшее имя, чем all, все равно, что утверждать, что C while следует назвать whiletrue. Это субъективно, но я думаю, что большинство людей предпочитают более короткие имена для встроенных модулей. Это потому, что вы все равно должны знать, что они делают, и вам приходится много их печатать.

Большинство программистов на Python поймут код, который я написал за несколько секунд. Я, вероятно, протестирую этот код на моей girlfried (она архитектор, а не программист, никогда не использовал Python), и я думаю, что она получит его. Использование генераторов лучше, чем использование numpy, потому что генераторы имеют более элегантный синтаксис. Numpy может быть быстрее, но вы выиграете только в редких случаях (генераторы, как я показал, работают быстро, вы выиграете, только если этот код является узким местом в вашей программе).

Вы, вероятно, не можете ожидать от Python ничего более описательного.

PS. Вот код, если вы делаете это в стиле memcpm (мне больше нравится всякая версия, но, возможно, вам понравится эта):

list(l) == [0] * len(l)
59
ответ дан 28 November 2019 в 06:21
поделиться

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

if not any(values):
    # etc...
12
ответ дан 28 November 2019 в 06:21
поделиться

Встроенная функция set получает итерацию и возвращает коллекцию (набор) уникальных значений.

Таким образом, его можно использовать здесь как:

set(it) == {0}
  • при условии, что it является итеративным
  • {0} - множество, содержащее только ноль

Больше информации о python set-types-set-frozenset здесь в документах.

0
ответ дан 28 November 2019 в 06:21
поделиться

Если values - это массив numpy, вы можете написать

import numpy as np
values = np.array((0, 0, 0, 0, 0))
all(values == 0)
5
ответ дан 28 November 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: