Форум сайта python.su
6
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]
[dict(k=k,**v) for k,v in enumerate(a) if v['v'] == 94]
Отредактировано wbt (Авг. 14, 2013 05:48:46)
Офлайн
568
А никак, только если дополнительный счетчик ввести, например так
from itertools import count a = [ {"v": 52}, {"v": 94}, {"v": 75} ] c=count() print [{"k":c.next(), "v":x["v"]} for x in a]
Офлайн
857
>>> 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']
Отредактировано py.user.next (Авг. 14, 2013 10:23:16)
Офлайн
568
если просто узнать индекс при уникальности элементов, то
print a.index({"v": 75})
Офлайн
6
Вопрос - спросить у итератора “а где мы сейчас находимся”? Есть ли вариант (без enumerate)? Если нет, то и не надо.
index - это не то.
Офлайн
43
Нет конечно. Никто не будет делать такой оверхед для итератора, очевидно же.
enumerate для того и создан. Не нравится нагромождение выражений - просто разбей их
Офлайн
43
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")))
Офлайн
47
wbt
Что-нибудь попроще, чем:
== 94]
Офлайн
6
То, что иногда нужно достать снизу, in-place. А приходится лезть наверх. python уже приучил жить по своим, питоновским правилам. А когда из-за данных, которые интерпретатор, я уверен, сам-то знает
, нужно сидеть и скрипт кромсать, меняя его логику, и смотря, что да где.
Впрочем, это вопрос больше теоретический, “есть ли жизнь на марсе”. Если есть, то и будем пользоваться, если нет, то не будем. Это как проблема множественного выбора, когда она вроде бы решаема, но в реальности - ничего хорошего не жди.
Тем более, для меня главное - понятность, читаемость и краткость кода - чтобы человек, который вчера python увидел, что-нибудь понял. Часто мне это удаётся. 
Офлайн
47
можно и 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)
Офлайн