根据词典列表中的特定条件删除词典条目

时间:2015-07-22 08:00:27

标签: python

我有一个词典列表:

List = [ {hostname: server1, username: john}
         {hostname: server2, username: jack}
         {hostname: server2, username: jonny}
         {hostname: server3, username: jules}
         {hostname: server1, username: jonny}
         {hostname: server1, username: jeff} ]

所以现在我想要每个主机名只有一个字典,如果每个主机名有几个条目,我想根据首选用户列表删除它们等等...... 例如,如果有一个用户john,jonny,jeff的server1,那么我想用john保存dict并删除其他的,如果没有john,那么保留一个jonny,依此类推,如果没有来自我的列表更喜欢然后我不在乎,只是删除其他人并留在一个。所以最后上面的例子看起来像这样

List = [ {hostname: server1, username: john}
         {hostname: server2, username: jonny}
         {hostname: server3, username: jules} ]

编辑:作为对评论的回应: 我甚至不知道该怎么做。

  1. 如何在每个字典值的列表中找到双重条目?
  2. 我如何比较它们并删除除一个以外的其他?
  3. 我应该从列表中删除该条目,还是应该创建一个新列表,只添加旧列表中的单个条目?
  4. 我的测试代码目前看起来像这样:

    #!/usr/bin/env python
     UserPref = ['john', 'jonny', 'jack']
     List = [{'hostname': 'server1', 'username': 'john'},
             {'hostname': 'server2', 'username': 'jack'},
             {'hostname': 'server2', 'username': 'jonny'},
             {'hostname': 'server3', 'username': 'jules'},
             {'hostname': 'server1', 'username': 'jonny'},
             {'hostname': 'server1', 'username': 'jeff'}]
    
     for item in List:
        if item.get('hostname') in List and item.get('username') not in UserPref:
            del item
     print List
    

2 个答案:

答案 0 :(得分:1)

按用户名首选项对它们进行排序,然后通过列表,只有在没有匹配的服务器名称时才添加到新列表。

答案 1 :(得分:1)

正如@vogomatix所解释的,以下Python脚本应该满足您的需求:

user_list = [
    {'hostname': 'server1', 'username': 'john'},
    {'hostname': 'server2', 'username': 'jack'},
    {'hostname': 'server2', 'username': 'jonny'},
    {'hostname': 'server3', 'username': 'jules'},
    {'hostname': 'server1', 'username': 'jonny'},
    {'hostname': 'server1', 'username': 'jeff'}]

def sort_by_preferred_users(key):
    preferred_users = ['john', 'jonny', 'jeff'] 
    username = key['username']
    return preferred_users.index(username) if username in preferred_users else len(preferred_users)

user_list.sort(key=sort_by_preferred_users)
new_user_list = []
server_list = []

for d in user_list:
    hostname = d['hostname'] 
    if hostname not in server_list:
        new_user_list.append(d)
        server_list.append(hostname)
        print d

它打印出以下输出,并为您提供new_user_list

{'username': 'john', 'hostname': 'server1'}
{'username': 'jonny', 'hostname': 'server2'}
{'username': 'jules', 'hostname': 'server3'}

使用Python 2.7.6进行测试