【问题标题】:Python remove duplicates in dictionary of listsPython删除列表字典中的重复项
【发布时间】:2017-08-13 20:31:36
【问题描述】:

我的字典看起来像这样:

dictionary= {apple:[3,5], banana:[3,3,6], strawberry:[1,2,4,5,5]}

如何删除每个值/列表的所有重复项(因此创建一个集合)?

我希望新字典看起来像这样:

{apple:[3,5], banana:[3,6], strawberry:[1,2,4,5]}

【问题讨论】:

  • 如果您熟悉集合,有什么问题?也许发布一个尝试?
  • 那不是有效的代码。添加引号。
  • 您的清单总是有序的吗?无论哪种情况,您都需要保留其剩余元素的顺序吗?元素是否可散列?

标签: python list dictionary nested unique


【解决方案1】:

使用字典理解和集合删除重复项

d= {'apple':[3,5], 'banana':[3,3,6], 'strawberry':[1,2,4,5,5]}
print {k:list(set(j)) for k,j in d.items()}

结果

{'strawberry': [1, 2, 4, 5], 'apple': [3, 5], 'banana': [3, 6]}

如果要保留列表顺序

d= {'apple':[3,5,5,8,4,5], 'banana':[3,3,6,1,1,3], 'strawberry':[5,1,1,2,4,5,5]}
print {k:sorted(set(j),key=j.index) for k,j in d.items()}

结果:

{'strawberry': [5, 1, 2, 4], 'apple': [3, 5, 8, 4], 'banana': [3, 6, 1]}

【讨论】:

  • @J.威廉姆斯如果你喜欢这个答案。你能接受吗
【解决方案2】:
for lst in dictionary.values():
    lst[:] = list(set(lst))

不过,通过set 可能会改变顺序。如果这一定不能发生,OrderedDict 是一个选项:

for lst in dictionary.values():
    lst[:] = list(collections.OrderedDict.fromkeys(lst))

或者如果要对列表进行排序,您可以这样做:

for lst in dictionary.values():
    lst[:] = sorted(set(lst))

或者如果列表已经排序,您可以保留第一个元素以及不与之前元素重复的每个元素。

for lst in dictionary.values():
    lst[:] = lst[:1] + [b for a, b in zip(lst, lst[1:]) if a != b]

【讨论】:

    【解决方案3】:
     dictionary= {"apple":[3,5], "banana":[3,3,6], "strawberry":[1,2,4,5,5]}
     for key,item in dictionary.items():
         dictionary[key]=set(item)
    
     print(dictionary)
    

    输出:

     {'apple': {3, 5}, 'banana': {3, 6}, 'strawberry': {1, 2, 4, 5}}
    

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 1970-01-01
      • 2012-02-16
      • 2011-10-28
      • 1970-01-01
      • 2016-03-13
      • 2012-03-14
      相关资源
      最近更新 更多