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

2024-04-24 02:47:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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'}]

我想按名称标识符对字典列表进行排序,并检查附近的每两个字典,如果它们在这个名称组合中不同,如果它们不同,我将在一个新列表中编写第一个字典并遍历整个列表,否则我将添加一个重复的字典,用字符串串联合并缓冲区键然后继续列表的其余部分。在不设置多个词典列表的情况下,有没有简单的方法来完成这项任务?我如何用多个键来比较附近的元素?你知道吗

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


Tags: 列表字典bufferbbbaaaname1site1site2
1条回答
网友
1楼 · 发布于 2024-04-24 02:47:14

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

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中,使用的字典越多,解决方案就越pythonic!你知道吗

相关问题 更多 >