Я просто узнал о понимании списка, которое является большим быстрым способом получить данные в одной строке кода. Но что-то прослушивает меня.
В моем тесте у меня есть этот вид словарей в списке:
[{'y': 72, 'x': 94, 'fname': 'test1420'}, {'y': 72, 'x': 94, 'fname': 'test277'}]
Понимание списка s = [ r for r in list if r['x'] > 92 and r['x'] < 95 and r['y'] > 70 and r['y'] < 75 ]
работы отлично над тем (это - на самом деле, результат этой строки),
Так или иначе я затем понял, что действительно не использую список в своем другом проекте, я использую словарь. Как так:
{'test1420': {'y': '060', 'x': '070', 'fname': 'test1420'}}
Тем путем я могу просто отредактировать свой словарь с var['test1420'] = ...
Но понимания списка не работают над этим! И я не могу отредактировать, перечисляет этот путь, потому что Вы не можете присвоить индекс как этот.
Есть ли иначе?
Вы можете сделать следующее:
s = dict([ (k,r) for k,r in mydict.iteritems() if r['x'] > 92 and r['x'] < 95 and r['y'] > 70 and r['y'] < 75 ])
Это принимает дикту, как вы указали, и возвращает "отфильтрованную" дикту.
If dct
is
{'test1420': {'y': '060', 'x': '070', 'fname': 'test1420'},
'test277': {'y': 72, 'x': 94, 'fname': 'test277'},}
Возможно, вы ищете что-то вроде:
[ subdct for key,subdct in dct.iteritems()
if 92<subdct['x']<95 and 70<subdct['y']<75 ]
Небольшая тонкость заключается в том, что Python позволяет составлять цепочки неравенств:
92<dct[key]['x']<95
вместо
if r['x'] > 92 and r['x'] < 95
Заметьте также, что выше я написал понимание списка, так что вы получаете обратно список (в данном случае диктов).
В Python3 есть такие вещи, как dict comprehensions, а также:
{ n: n*n for n in range(5) } # dict comprehension
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
В Python2 эквивалент был бы
dict( (n,n*n) for n in range(5) )
Я не уверен, ищете ли вы список dicts или dict of dicts, но если вы понимаете примеры выше, то легко можете изменить мой ответ, чтобы получить то, что вы хотите.
Вы можете получить список значений словаря d с помощью d.values()
. Ваше понимание списка должно работать, хотя мне немного непонятно, что именно вы хотите получить на выходе.
Есть ли другой способ?
Почему бы не рассмотреть возможность использования некоторых легких объектов?
Вы можете по-прежнему использовать понимания списков для сбора или фильтрации объектов, и получить большой выигрыш в ясности/расширяемости.
>>> class Item(object):
... def __init__(self, x, y, name):
... self.x = x
... self.y = y
... self.name = name
...
>>> list_items = []
>>> list_items.append(Item(x=70, y=60, name='test1420'))
>>> list_items.append(Item(x=94, y=72, name='test277'))
>>> items_matching = [item for item in list_items
if 92 < item.x < 95 and 70 < item.y < 75]
>>> for item in items_matching:
... print item.name
...
test277
>>> first_item = items_matching[0]
>>> first_item.x += 50
>>> first_item.x
144
Похоже, вам нужно что-то вроде:
my_dict = {'test1420': {'y': '060', 'x': '070', 'fname': 'test1420'},
'test277' : {'y': '072', 'x': '094', 'fname': 'test277'}}
new_dict = dict((k,v) for k,v in my_dict.items()
if 92 < int(v['x']) < 95 and 70 < int(v['y']) < 75)
Некоторые примечания к этому коду:
low