Понимание списка Python для словарей в словарях?

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

В моем тесте у меня есть этот вид словарей в списке:

[{'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'] = ...

Но понимания списка не работают над этим! И я не могу отредактировать, перечисляет этот путь, потому что Вы не можете присвоить индекс как этот.

Есть ли иначе?

21
задан skerit 12 July 2010 в 18:45
поделиться

5 ответов

Вы можете сделать следующее:

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 ])

Это принимает дикту, как вы указали, и возвращает "отфильтрованную" дикту.

36
ответ дан 29 November 2019 в 20:12
поделиться

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, но если вы понимаете примеры выше, то легко можете изменить мой ответ, чтобы получить то, что вы хотите.

9
ответ дан 29 November 2019 в 20:12
поделиться

Вы можете получить список значений словаря d с помощью d.values(). Ваше понимание списка должно работать, хотя мне немного непонятно, что именно вы хотите получить на выходе.

0
ответ дан 29 November 2019 в 20:12
поделиться

Есть ли другой способ?

Почему бы не рассмотреть возможность использования некоторых легких объектов?

Вы можете по-прежнему использовать понимания списков для сбора или фильтрации объектов, и получить большой выигрыш в ясности/расширяемости.

>>> 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
0
ответ дан 29 November 2019 в 20:12
поделиться

Похоже, вам нужно что-то вроде:

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)

Некоторые примечания к этому коду:

  1. Я использую выражение генератора вместо понимания списка
  2. Python позволяет комбинировать неравенство проверяет как low
  3. Конструктор dict () принимает итеративный кортежей ключ / значение для создания словарь
2
ответ дан 29 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: