python通过合并不同的值来过滤掉伪重复项

时间:2014-05-21 21:08:40

标签: python list dictionary filtering

我有一个包含八个键的词典列表,我想选择那些只有一个键不同的词条并合并它们。一个很小的例子:

listWithDups = [{'name1': 'aaa', 'len1': 3, 'site1': 'a', 'name2': 'zzzz', 'len2': 4, 'site2': 'z', 'retailer': 'ret1', 'buffer': 'buff1'},
                {'name1': 'bbb', 'len1': 3, 'site1': 'b', 'name2': 'zzzz', 'len2': 4, 'site2': 'z', 'retailer': 'ret1', 'buffer': 'buff1'},
                {'name1': 'aaa', 'len1': 3, 'site1': 'a', 'name2': 'zzzz', 'len2': 4, 'site2': 'z', 'retailer': 'ret1', 'buffer': 'buff2'}]

第一个和最后一个列表条目只是在密钥'缓冲区'因此我想要一个字典列表,如:

listWithoutDups = [{'name1': 'aaa', 'len1': 3, 'site1': 'a', 'name2': 'zzzz', 'len2': 4, 'site2': 'z', 'retailer': 'ret1', 'buffer': 'buff1 / buff2'},
                   {'name1': 'bbb', 'len1': 3, 'site1': 'b', 'name2': 'zzzz', 'len2': 4, 'site2': 'z', 'retailer': 'ret1', 'buffer': 'buff1'}]

我想通过名称标识符对字典列表进行排序,并检查每个附近的字典,如果它们在这个名称组合中有所不同,如果他们这样做,我会在新列表中编写第一个字典并遍历整个列表,否则我将添加一个重复的字典,将缓冲键与字符串连接合并,然后继续列表的其余部分。如果没有设置多个词典列表,有没有简短的方法来执行此任务?如何通过多个键比较附近的元素?

我希望我的描述不会太混乱:/

1 个答案:

答案 0 :(得分:0)

假设只有缓冲区不同,并且只使用其他2个键:

def merge_buffers(dupes):
    merged = {}
    for item in dupes:
        # create tuple key, so all entries with same key will be appended here
        key = (item['name1'], item['len1'])
        if not key in merged:
            merged[key] = []
        merged[key].append(item['buffer'])
    return merged

这是一个想法,扩展到更多的键作为练习给读者。

结果是dict,key是您唯一的name1 / len1,value是为此组合其他键找到的所有缓冲区的列表。

所以要将它转换回字典列表:

unduped_dict = merge_buffers(dupes)
unduped_list = []
for key in unduped_dict:
    item = {'name1': key[0], 'len1': key[1], 'buffer': '/'.join(unduped_dict[key]) }
    unduped_list.append( item )

在Python中,你使用的词典越多,你的解决方案就越诡异!