Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 14, 2013 05:47:19

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

индекс без enumerate

python 2.7

допустим, есть вот такой список словарей:

a = [ {"v": 52}, {"v": 94}, {"v": 75} ]

и что-нибудь типа такого:

for v in a:
# или
for v in a[::-1]:
# или
[v for v in a if v['v'] == 52]

вопрос - есть ли без for k,v in enumerate(a): способ узнать индекс в каком-нибудь из вышеперечисленных случаев?

Что-нибудь попроще, чем:
[dict(k=k,**v) for k,v in enumerate(a) if v['v'] == 94]



Бейсик - не порок, Гвидо - не пророк

Отредактировано wbt (Авг. 14, 2013 05:48:46)

Офлайн

#2 Авг. 14, 2013 06:06:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

индекс без enumerate

А никак, только если дополнительный счетчик ввести, например так

from itertools import count
a = [ {"v": 52}, {"v": 94}, {"v": 75} ]
c=count()
print [{"k":c.next(), "v":x["v"]} for x in a]



Офлайн

#3 Авг. 14, 2013 10:21:16

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

индекс без enumerate

>>> a = [{"v": 52}, {"v": 94}, {"v": 75}, {"v": 75}]
>>> f = filter(lambda i: i[1]['v'] == 75, enumerate(a))
>>> f
[(2, {'v': 75}), (3, {'v': 75})]
>>> 
>>> a = [{"v": 52}, {"v": 94}, {"v": 75}, {"v": 75}]
>>> f = filter(lambda i: i[1]['v'] == 75, enumerate(a[::-1]))
>>> f
[(0, {'v': 75}), (1, {'v': 75})]
>>>

можешь заморочиться с выражением
i[1]['v']
через operator.itemgetter(), если нужна дополнительная скорость



Отредактировано py.user.next (Авг. 14, 2013 10:23:16)

Офлайн

#4 Авг. 14, 2013 10:35:10

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

индекс без enumerate

если просто узнать индекс при уникальности элементов, то

print a.index({"v": 75})



Офлайн

#5 Авг. 14, 2013 11:39:16

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

индекс без enumerate

Вопрос - спросить у итератора “а где мы сейчас находимся”? Есть ли вариант (без enumerate)? Если нет, то и не надо. index - это не то.



Бейсик - не порок, Гвидо - не пророк

Офлайн

#6 Авг. 14, 2013 12:20:19

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

индекс без enumerate

Нет конечно. Никто не будет делать такой оверхед для итератора, очевидно же.
enumerate для того и создан. Не нравится нагромождение выражений - просто разбей их

Офлайн

#7 Авг. 14, 2013 13:42:49

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

индекс без enumerate

from operator import itemgetter
from functools import reduce
 
a = [ {"v": 52}, {"v": 94}, {"v": 75}]
 
def remove(bad, sequence, key=lambda elt : elt):
    return filter(lambda e : key(e) != bad, sequence)
 
first = lambda seq : seq[0]
rest = lambda seq : seq[1:]
 
def applicator(*funcs):
    return lambda elt : reduce(lambda res, x : x(res), rest(funcs), first(funcs)(elt))
         
r = remove(94, enumerate(a), key=applicator(itemgetter(1), itemgetter("v")))

Офлайн

#8 Авг. 14, 2013 14:26:27

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

индекс без enumerate

wbt
Что-нибудь попроще, чем:
== 94]

а что там сложного?

Офлайн

#9 Авг. 15, 2013 03:32:26

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

индекс без enumerate

То, что иногда нужно достать снизу, in-place. А приходится лезть наверх. python уже приучил жить по своим, питоновским правилам. А когда из-за данных, которые интерпретатор, я уверен, сам-то знает , нужно сидеть и скрипт кромсать, меняя его логику, и смотря, что да где.

Впрочем, это вопрос больше теоретический, “есть ли жизнь на марсе”. Если есть, то и будем пользоваться, если нет, то не будем. Это как проблема множественного выбора, когда она вроде бы решаема, но в реальности - ничего хорошего не жди.

Тем более, для меня главное - понятность, читаемость и краткость кода - чтобы человек, который вчера python увидел, что-нибудь понял. Часто мне это удаётся.



Бейсик - не порок, Гвидо - не пророк

Офлайн

#10 Авг. 15, 2013 11:30:23

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

индекс без enumerate

можно и in-place


a = [ {"v": 52}, {"v": 94}, {"v": 75} ]
for i in xrange(len(a)):
    if a[i]['v'] == 94:
        a[i]['k'] = i
    else:
        a[i] = None
print filter(None, a)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version