У меня есть итерабельность записей, на которых я хотел бы собрать некоторую простую статистику, скажем, подсчет всех чисел, делящихся на два, и количество всех чисел, делящихся на три.Большинство pythonic способ подсчета совпадающих элементов в чем-то итерабельном
Моя первая альтернатива, в то время итерацию только через список один раз и избежать расширения списка (и сохранение split loop рефакторинга в виду), выглядит довольно раздутой:
(альт 1)
r = xrange(1, 10)
twos = 0
threes = 0
for v in r:
if v % 2 == 0:
twos+=1
if v % 3 == 0:
threes+=1
print twos
print threes
Это выглядит довольно хорошо, но имеет тот недостаток, разложив выражение в список:
(альт 2)
r = xrange(1, 10)
print len([1 for v in r if v % 2 == 0])
print len([1 for v in r if v % 3 == 0])
То, что я действительно хотел бы что-то вроде функции, как это:
(альт 3)
def count(iterable):
n = 0
for i in iterable:
n += 1
return n
r = xrange(1, 10)
print count(1 for v in r if v % 2 == 0)
print count(1 for v in r if v % 3 == 0)
Но это выглядит как-то, что может быть сделано без функции. Окончательный вариант заключается в следующем:
(альт 4)
r = xrange(1, 10)
print sum(1 for v in r if v % 2 == 0)
print sum(1 for v in r if v % 3 == 0)
и в то время как самый маленький (и в моей книге, пожалуй, самый элегантный) он не чувствует, как он выражает намерение очень хорошо.
Итак, мой вопрос к вам:
Какая альтернатива вам больше всего нравится, чтобы собрать эти типы статистики? Не стесняйтесь предоставлять свою собственную альтернативу, если у вас есть что-то лучше.
Чтобы прояснить некоторую путаницу ниже:
- В действительности мой фильтр предикаты являются более сложными, чем просто этот простой тест.
- Объектов я перебор крупнее и сложнее, чем просто цифры
- Моих функций фильтра более различны и трудно параметризации в один предикат
Re. повторяя дважды, у него есть кое-что для него, чтобы понять его, но кроме этого, не уменьшит ли накладные расходы от итерации один раз, когда будет съедено количество выполненного не-C-кода? – 2008-10-01 12:13:26
Конечно, если я только повторю, как только он работает на одноразовых итерациях тоже, duh :) Не думал, что далеко. – 2008-10-01 15:30:00
Мне нравится ваше решение. Но вы говорите: «необходимость перебора по списку несколько раз не изящна». Если существует n значений и m предикатов, вы повторяете n раз по предикатам m, так в чем преимущество перед повторением m раз на n значений? Примечание. Я новичок в Python. Ура! – 2008-10-02 15:38:32