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)
Используйте генераторы, а не списки в таких случаях:
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)
Если вы знаете, что итеративный объект будет содержать только целые числа, вы можете просто сделать это:
if not any(values):
# etc...
Встроенная функция set
получает итерацию и возвращает коллекцию (набор) уникальных значений.
Таким образом, его можно использовать здесь как:
set(it) == {0}
it
является итеративным {0}
- множество, содержащее только ноль Больше информации о python set-types-set-frozenset здесь в документах.
Если values - это массив numpy, вы можете написать
import numpy as np
values = np.array((0, 0, 0, 0, 0))
all(values == 0)