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

python通过合并不同的值来过滤伪重复项,python,list,dictionary,filtering,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'

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

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'}]
第一个和最后一个列表条目在键“buffer”中不同,因此我需要一个字典列表,如:

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'}]
我想按名称标识符对字典列表进行排序,并检查附近的两个字典是否在名称组合中存在差异。如果存在差异,我将在新列表中编写第一个字典并遍历整个列表,否则我将添加一个重复的字典,将缓冲区键与字符串串联合并然后继续列表的其余部分。在不设置多个词典列表的情况下,有没有什么捷径可以完成这项任务?如何通过多个键比较附近的元素


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

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

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,键是您唯一的
name1
/
len1
,值是为其他键组合找到的所有缓冲区的列表

因此,要将其转换回字典列表:

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中,使用的字典越多,您的解决方案就越符合Python

唯一的区别是缓冲区?或者您也想检测其他键的差异?是的,唯一的差异是缓冲区,因此应该合并其他键相同的条目。首先,为您的解决方案提供一个大thx!这正是我想说的:)您的代码中有两个输入错误,合并的[key]后面缺少一个括号。append(item['buffer']和您在第二个代码段的函数调用中缺少一个's:)仅供我理解。。合并的_buffers()函数的结果是一个字典?@heira你说得对。我只是在没有测试的情况下打出来,只是为了检查我做作业时你是否认真阅读。