Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 27, 2014 18:48:12

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

С itemgetter красивее выглядит

Офлайн

#2 Июнь 27, 2014 18:49:52

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

john123
Так Вам указали, что это мелочь и решается одной строкой
А вот код колоссально отличается…

Офлайн

#3 Июнь 27, 2014 18:58:24

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

john123
С itemgetter красивее выглядит
+ он быстрее.



Офлайн

#4 Июнь 27, 2014 19:02:45

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

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

4kpt_II
А вот код колоссально отличается…
Этот код можно разложить на отдельные функции, устранив lambda и получится весьма читаемо.

Отредактировано john123 (Июнь 27, 2014 19:03:17)

Офлайн

#5 Июнь 27, 2014 19:06:01

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

john123
itemgetter или сам код?
itemgetter

john123
Этот код можно разложить на отдельные функции, устранив lambda и получится весьма читаемо.

Этот код, просто развлечение.
Писать надо что-то типа варианта Shaman



Офлайн

#6 Июнь 27, 2014 22:16:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

Код Shaman'а с возвращением списка (упорядоченного).

>>> data = [
...     ["name 1", 1],
...     ["name 1", 4],
...     ["name 1", 2],
...     ["name 2", 10],
...     ["name 3", 1],
...     ["name 3", 3],
...     ["name 3", 1],
...     ["name 4", 7],
...     ["name 4", 1],
...     ["name 4", 2],
... ]
>>> 
>>> r = {}
>>> o = []
>>> for n, v in data:
...     r[n] = r.get(n, 0) + v
...     if not o or o[-1] != n:
...         o.append(n)
... 
>>> out = [(i, r[i]) for i in o]
>>> 
>>> print(out)
[('name 1', 7), ('name 2', 10), ('name 3', 5), ('name 4', 10)]
>>>


john123
А во-вторых, что если в строке будет больше двух колонок?
Shaman
Это будет совсем другая история.

Не очень сильно будет код отличаться.
>>> def f(seq):
...     return seq
... 
>>> lst = [['a', 1, 2], ['b', 3, 4]]
>>> 
>>> for i, *t in lst:
...     print(i, f(t))
... 
a [1, 2]
b [3, 4]
>>>



Отредактировано py.user.next (Июнь 27, 2014 22:24:34)

Офлайн

#7 Июнь 28, 2014 09:14:12

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

Я не уверен в спископотребностях ТС-а, а словарь всегда можно проитерировать.

Офлайн

#8 Июнь 29, 2014 04:55:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

Shaman
Я не уверен в спископотребностях ТС-а
В первом сообщении написано.

Shaman
а словарь всегда можно проитерировать
Словарь не упорядочен.
>>> {'name1': 1, 'name10': 1, 'name2': 2, 'name20': 2}
{'name10': 1, 'name20': 2, 'name2': 2, 'name1': 1}
>>>



Офлайн

#9 Июнь 29, 2014 15:01:22

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

py.user.next
Словарь не упорядочен.
Это не всегда нужно.

Офлайн

#10 Июнь 29, 2014 21:27:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Подсчет элементов списка по условию

У него они упорядоченные - что входной, что выходной.



Отредактировано py.user.next (Июнь 29, 2014 21:27:27)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version