如何删除列表字典中的列表元素?

时间:2016-07-01 19:00:58

标签: python list dictionary

我正在尝试从列表字典中过滤出讨厌的 值。这是一个示例字典:

parsed_data = {'DATA1': [None, None, None, None, None, None, None, None, None, None, None,
     None, None, None, None, None, None, None, None, '0.17998362', '0.06388072',
     '0.02091766', None, '0.00602364', '0.03171121', None, '1.39579976', '0.16731957',
     '0.21564664', '0.03516583'], 'DATA2': [None, None, None, None, None, None, None,
     None, None, None, None, None, None, None, None, None, None, None, None, None,
     None, None, None, None, None, None, None, None, None, None, None, None], 'DATA3':
     [None, None, None, None], 'DATA4': ['0.18406565', '0.06776296', '0.14278403',
     '0.11962064', '0.00998447']}

我认为这个词典理解会起作用,但如果在列表中的任何地方找到 ,它会删除整个键。

filtered = {x:y for x,y in parsed_data.items() if len(y)>0 and None not in y}

我也尝试用嵌套列表理解进行字典理解,但看起来很疯狂,只是通过观察它就可以通过大脑融化。

3 个答案:

答案 0 :(得分:2)

你需要迭代过滤Nones的列表中的元素并保留其他所有内容,如果你想更改原始版本只更新每个列表:

for v in parsed_data.values():
        v[:] = (ele for ele in v if ele is not None)

或者如果你想要一个新的词典:

 new = {k : [ele for ele in v if ele is not None] for k,v in parsed_data.items()}

两者都会给你:

{'DATA1': ['0.17998362',
           '0.06388072',
           '0.02091766',
           '0.00602364',
           '0.03171121',
           '1.39579976',
           '0.16731957',
           '0.21564664',
           '0.03516583'],
 'DATA2': [],
 'DATA3': [],
 'DATA4': ['0.18406565',
           '0.06776296',
           '0.14278403',
           '0.11962064',
           '0.00998447']}

如果您使用的是python 3,则可以使用 None将合并过滤器用于第一个逻辑。 ne

for v in parsed_data.values():
        v[:] = filter(None.__ne__, v)

答案 1 :(得分:2)

您可以使用以下dict理解,然后将其分配回parsed_data

parsed_data = {key: [i for i in value if i] for key, value in parsed_data.items()}

输出

{'DATA2': [],
 'DATA3': [],
 'DATA1': ['0.17998362', '0.06388072', '0.02091766', '0.00602364', '0.03171121', '1.39579976', '0.16731957', '0.21564664', '0.03516583'],
 'DATA4': ['0.18406565', '0.06776296', '0.14278403', '0.11962064', '0.00998447']}

答案 2 :(得分:0)

您可以创建一个新的dic,将每个键的值设置为空列表,然后在每个列表中附加值!=无

new_arsed_data={}
for key,value in arsed_data.items():
    new_arsed_data.setdefault(key,[])
    for item in value:
        if item!=None:
            new_arsed_data[key].append(item)

与其他人相比,这是一个更复杂/更少pythonic的答案,但对于那些(像我这样)是python新手的人来说可能更容易理解:)