我有一个包含八个键的词典列表,我想选择那些只有一个键不同的词条并合并它们。一个很小的例子:
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'}]
我想通过名称标识符对字典列表进行排序,并检查每个附近的字典,如果它们在这个名称组合中有所不同,如果他们这样做,我会在新列表中编写第一个字典并遍历整个列表,否则我将添加一个重复的字典,将缓冲键与字符串连接合并,然后继续列表的其余部分。如果没有设置多个词典列表,有没有简短的方法来执行此任务?如何通过多个键比较附近的元素?
我希望我的描述不会太混乱:/
答案 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中,你使用的词典越多,你的解决方案就越诡异!