Python - 删除字典中的嵌套列表

时间:2018-03-31 11:50:28

标签: python loops dictionary

我有一个名为results的字典。

dict的格式如下:

{'a': [['1', '2', '4'],['1', '2', '2'],['1', '2', '2']], 'b': [['2', '2', '4'],['2', '2', '2'],['1', '2', '4']], 'c': [['1', '2', '4'],['1', '2', '2'],['1', '2', '2']]}

我希望删除每个键的重复嵌套列表,因此将dict保留为:

{'a': [['1', '2', '4'],['1', '2', '2']], 'b': [['2', '2', '4'],['2', '2', '2'],['1', '2', '4']], 'c': [['1', '2', '4'],['1', '2', '2']]}

我试过了:

newdict = {}
for k, v in results.items():
    for i in v:
        if i not in i:
            newdict[k] = i

任何帮助?提前谢谢!

2 个答案:

答案 0 :(得分:3)

您的代码无法修复(抱歉),主要是因为这两行:

 if i not in i:  # makes no sense testing if something is inside itself
      newdict[k] = i   # overwrites the key with one list

您必须计算每个列表,并且每个列表只保留一次。

如果顺序并不重要,你可以使用嵌套的字典/集合/列表理解来做到这一点。

results = {'a': [['1', '2', '4'],['1', '2', '2'],['1', '2', '2']], 'b': [['2', '2', '4'],['2', '2', '2'],['1', '2', '4']], 'c': [['1', '2', '4'],['1', '2', '2'],['1', '2', '2']]}

newdict = {k:[list(y) for y in {tuple(x) for x in v}] for k,v in results.items()}

print(newdict)

结果:

{'a': [['1', '2', '2'], ['1', '2', '4']], 'b': [['2', '2', '4'], ['1', '2', '4'], ['2', '2', '2']], 'c': [['1', '2', '2'], ['1', '2', '4']]}

使用set可以保持单一性,但是您无法在list中放置set,因此表达式首先转换为tuple(可以清除),并在处理完成后转换回list

答案 1 :(得分:1)

如果订单重要,您可以使用以下内容:

results = {'a': [['1', '2', '4'],['1', '2', '2'],['1', '2', '2']],
           'b': [['2', '2', '4'],['2', '2', '2'],['1', '2', '4']],
           'c': [['1', '2', '4'],['1', '2', '2'],['1', '2', '2']]}

print({k: [y for x, y in enumerate(v) \
     if y not in v[:x]] for k, v in results.items()})

<强>输出

 {'a': [['1', '2', '4'], ['1', '2', '2']], 
  'b': [['2', '2', '4'], ['2', '2', '2'], ['1', '2', '4']], 
  'c': [['1', '2', '4'], ['1', '2', '2']]} 

要跳过第一个子列表并要求仅检查其余子列表,您可以执行以下操作:

print({k: [y for x, y in enumerate(v) \
     if y not in v[1:x]] for k, v in results.items()})