2013-10-27 1 views
0

Я пишу свою первую программу python для управления пользователями в Atlassian On Demand с использованием их RESTful API. Я вызываю пользователя/search? Username = API для извлечения списков пользователей, который возвращает JSON. Результаты список сложных типов словарей, которые выглядят примерно так:Удалить дубликаты из списка вложенных словарей

[ 
     { 
      "self": "http://www.example.com/jira/rest/api/2/user?username=fred", 
      "name": "fred", 
      "avatarUrls": { 
       "24x24": "http://www.example.com/jira/secure/useravatar?size=small&ownerId=fred", 
       "16x16": "http://www.example.com/jira/secure/useravatar?size=xsmall&ownerId=fred", 
       "32x32": "http://www.example.com/jira/secure/useravatar?size=medium&ownerId=fred", 
       "48x48": "http://www.example.com/jira/secure/useravatar?size=large&ownerId=fred" 
      }, 
      "displayName": "Fred F. User", 
      "active": false 
     }, 
     { 
      "self": "http://www.example.com/jira/rest/api/2/user?username=andrew", 
      "name": "andrew", 
      "avatarUrls": { 
       "24x24": "http://www.example.com/jira/secure/useravatar?size=small&ownerId=andrew", 
       "16x16": "http://www.example.com/jira/secure/useravatar?size=xsmall&ownerId=andrew", 
       "32x32": "http://www.example.com/jira/secure/useravatar?size=medium&ownerId=andrew", 
       "48x48": "http://www.example.com/jira/secure/useravatar?size=large&ownerId=andrew" 
      }, 
      "displayName": "Andrew Anderson", 
      "active": false 
     } 
    ] 

Я звоню это несколько раз, и таким образом получать дубликаты людей в моих результатах. Я искал и читал, но не могу понять, как дедуплицировать этот список. Я понял, как отсортировать этот список с помощью лямбда-функции. Я понимаю, что могу сортировать список, а затем повторять и удалять дубликаты. Я думаю, что должно быть более элегантное решение.

Спасибо!

ответ

0

Имена пользователей уникальны, правда?

Должно ли быть list? Похоже, это простое решение - сделать его dictdict s. Используйте имена пользователей в качестве ключей, и будет присутствовать только самая последняя версия.

Если значения должны быть упорядочены, есть OrderedDict типа вы можете посмотреть в: http://docs.python.org/2/library/collections.html#collections.OrderedDict

+0

Интерфейс RESTful должен вызываться несколько раз, чтобы получить всех пользователей, поэтому имена пользователей не уникальны в объединенном списке. На данный момент я отсортировал список с помощью специальной функции сортировки, а затем повторил его в обратном порядке, удалив дубликаты. Похоже, было бы более простое решение. – bschulz

+0

Я не имел в виду, что имена пользователей будут уникальными в списке; Я имел в виду, что я ожидаю, что каждое имя пользователя соответствует точно одному пользователю (так что вам не придется беспокоиться о конфликтующих записях в 'dict'). Энтони Конг опубликовал, что я получаю; эта ссылка, которую я разместил, полезен только в том случае, если порядок имен пользователей имеет значение, но я предполагаю, что это, вероятно, не так. –

+0

Ah - gotcha. Да, вы были правы. Что касается порядка сортировки, я преобразовал словарь обратно в список, а затем использовал метод sort() с лямбда-функцией ... быстрый, быстрый, простой и гораздо более элегантный, чем мой ручной поиск дубликатов. Большое спасибо за то, что указали мне на правильный путь! – bschulz

0

Пусть говорят, что это то, что вы получили,

JSON = [ 
     { 

      "name": "fred", 
... 
}, 
     { 

      "name": "peter", 
... 
}, 
     { 

      "name": "fred", 
... 
}, 

Преобразовать этот список Dict в Словаре в Словаре удалит дубликаты, например, так:

r = dict([(user['name'], user) for user in JSON]) 

В r вы найдете только одну запись Фреда и питер каждого.

+0

Понимание было бы намного менее шумным, как понимание dict: '{user ['name']: пользователь для пользователя в JSON}' –

+0

Nice! Работает! Спасибо! – bschulz

+1

Просто, чтобы закрыть цикл на этом ... вот мой окончательный код 'result = dict ([(user.name, user) для пользователя в результате]) result = [значение для ключа, значение в result.iteritems() ] result.sort (key = lambda d: d.name) ' – bschulz

Смежные вопросы