Найти - Пользователи
Полная версия: индекс без enumerate
Начало » Python для новичков » индекс без enumerate
1
wbt
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]
FishHook
А никак, только если дополнительный счетчик ввести, например так
from itertools import count
a = [ {"v": 52}, {"v": 94}, {"v": 75} ]
c=count()
print [{"k":c.next(), "v":x["v"]} for x in a]
py.user.next
>>> 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(), если нужна дополнительная скорость
FishHook
если просто узнать индекс при уникальности элементов, то
print a.index({"v": 75})
wbt
Вопрос - спросить у итератора “а где мы сейчас находимся”? Есть ли вариант (без enumerate)? Если нет, то и не надо. index - это не то.
sergeek
Нет конечно. Никто не будет делать такой оверхед для итератора, очевидно же.
enumerate для того и создан. Не нравится нагромождение выражений - просто разбей их
sergeek
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")))
bismigalis
wbt
Что-нибудь попроще, чем:
== 94]

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

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

Тем более, для меня главное - понятность, читаемость и краткость кода - чтобы человек, который вчера python увидел, что-нибудь понял. Часто мне это удаётся.
bismigalis
можно и 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)

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB