2014-07-06 3 views
0

내가 목록과 같이 있다고 가정하자 :None을 None 값으로 갖는리스트에서 모든 dict을 어떻게 제거해야합니까?

[{'name': 'Blah1', 'age': x}, {'name': 'Blah2', 'age': y}, {'name': None, 'age': None}] 

'이름'과 '나이'값이 모두 채워지거나 비어있는 것 중 하나 보장된다.

나는이 시도 :

for person_dict in list: 
    if person_dict['name'] == None: 
     list.remove(person_dict) 

을하지만 루프에 대한 때때로 색인을 건너 뛰어 일부 빈 사람을 무시하기 때문에 분명히이 작동하지 않습니다.

필자는 비교적 새로운 Python을 사용하고 있으며, 키와 관련된 특정 값을 가진 dicts를 대상으로 할 수있는 목록 방법이 있는지 궁금합니다.

편집 : 코멘트

+0

그건 목록이 아닌 dicts의 튜플입니다. – dawg

+0

BTW : [] 목록에 tuple()이 없습니다. 요소를 제거 할 수 없습니다. – furas

+0

오. 사실 목록이 있어요. 잘못된 표기법이 수정됩니다. – Antrikshy

답변

1
None 값에 대한 모든 DICT 키를 테스트 할 수있는 DICT의 가치에 None의 존재

그냥 시험 :

>>> ToD=({'name': 'Blah1', 'age': 'x'}, {'name': 'Blah2', 'age': 'y'}, {'name': None, 'age': None}) 
>>> [e for e in ToD if None not in e.values()] 
[{'age': 'x', 'name': 'Blah1'}, {'age': 'y', 'name': 'Blah2'}] 

또는 사용 필터 :

>>> filter(lambda d: None not in d.values(), ToD) 
({'age': 'x', 'name': 'Blah1'}, {'age': 'y', 'name': 'Blah2'}) 

또는, 그것이 경우 제한된 테스트를 '이름'으로 변경 :

>>> filter(lambda d: d['name'], ToD) 
({'age': 'x', 'name': 'Blah1'}, {'age': 'y', 'name': 'Blah2'}) 
0
for index,person_dict in enumerate(lis): 
    if person_dict['name'] == None: 
     del lis[index] 

을 지적 고정 튜플 표기법 당신은 또한 당신은 필터로 지능형리스트를 사용할 수 있습니다

lis=[person_dict for person_dict in lis if person_dict['name'] != None] 

변수

1

List을 사용하지 않습니다 시도 할 수 있습니다 나열 이 같은

[c_dict for c_dict in dict_lst if all(c_dict[key] is not None for key in c_dict)] 

이렇게하면 모든 값이 None이 아닌 사전 만 가져옵니다.

0

허용 된 데이터로 새 목록을 만들 수 있습니다. 튜플을 가지고 있다면 새로운 목록을 만들어야합니다.

목록 이해력은 빠를 수 있지만이 버전은 초보자에게 더 읽기 쉽습니다.

data = ({'name': 'Blah1', 'age': 'x'}, {'name': 'Blah2', 'age': 'y'}, {'name': None, 'age': None}) 

new_data = [] 

for x in data: 
    if x['name']: # if x['name'] is not None and x['name'] != '' 
     new_data.append(x) 

print new_data 
관련 문제