我有一个名为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
任何帮助?提前谢谢!
答案 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()})