2013-10-27 62 views
0

我正在编写我的第一个Python程序,以使用其RESTful API在Atlassian On Demand中管理用户。我调用users/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 
     } 
    ] 

我打这个多次,因此得到重复的人在我的结果。我一直在搜索和阅读,但无法弄清楚如何对此列表进行重复数据删除。我想出了如何使用lambda函数对这个列表进行排序。我意识到我可以对列表进行排序,然后迭代和删除重复项。我在想,必须有一个更优雅的解决方案。

谢谢!

回答

0

用户名是唯一的,对吧?

是否必须是list?看起来像一个简单的解决方案将是使其dictdict s代替。使用用户名作为密钥,只有最新的版本才会出现。

如果值已经被订购,还有一个OrderedDict类型你可以看看:http://docs.python.org/2/library/collections.html#collections.OrderedDict

+0

必须多次调用RESTful接口才能获取所有用户,因此用户名在组合列表中不是唯一的。现在,我使用自定义排序函数对列表进行排序,然后通过列表反向迭代,删除重复项。似乎会有一个更简单的解决方案。 – bschulz

+0

我并不是说用户名在列表中是唯一的;我的意思是我期望每个用户名只对应一个用户(所以你不必担心'dict'中的冲突条目)。安东尼孔张贴我正在得到的;我发布的链接仅在用户名的顺序很重要时才有用,但我认为它可能不会。 –

+0

啊 - 搞错了。是的 - 你是对的。关于排序顺序,我将字典转换回列表,然后使用带lambda函数的sort()方法...比我手动重复检测更快,更简单,更优雅。非常感谢您指点我正确的道路! – bschulz

0

让我们说,这是你得到了什么,

JSON = [ 
     { 

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

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

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

转换字典的这份名单的字典字典中会删除重复的,就像这样:

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

r你只能找到弗雷德和彼得的每一个记录。

+0

作为一个字典理解,理解会少很多:'{user ['name']:JSON用户的用户}' –

+0

不错!作品!谢谢! – bschulz

+1

只是为了关闭这个循环......这里是我的最终代码'result = dict([(user.name,user)for user in result]) result = [key的值,result.iteritems() ] result.sort(key = lambda d:d.name)' – bschulz