2010-07-07 4 views
3

이 일을보다 파이썬 방법은 내가 반복해야하기 때문에 나는이 작업을 수행 할 이유는는에`None`을 변경하는 더 파이썬 방법`[]`보다

  if self.name2info[name]['prereqs'] is None: 
       self.name2info[name]['prereqs'] = [] 
      if self.name2info[name]['optionals'] is None: 
       self.name2info[name]['optionals'] = [] 

가?인가 거기 나중에. 그 값은 기본값이기 때문에 때로 시작하는 것은 None입니다. []을 기본값으로 설정하지 않는 것이 좋습니다.

감사합니다.

+8

처음부터 기본값을 []로 변경할 수 있습니까? (기본값은'defaultdict '를 사용하고 있다고 가정합니다)? –

+0

아니요, 아닙니다. 전에 사용했지만 많이 사용하지 않았습니다. 이 경우에도 유용 할 것입니다. 감사! –

답변

4

당신이 원하는 경우이 :

self.name2info[name]['prereqs'] = self.name2info[name]['prereqs'] or []

+0

'None'과'[] '둘 다'False'로 평가됩니다, 그렇죠? 왜 그게 효과가 있니? –

+2

@Alex : 예, []는 False로 평가됩니다. 따라서 항목이 이미 빈 목록이면 다른 빈 목록으로 대체됩니다. 이것이 문제가되는 유일한 시간은 여러 항목이 같은 목록을 참조하도록하려는 경우입니다. 대부분 원하지 않으면 동일한 목록에 대한 여러 참조로 인해 미묘한 버그가 발생할 수 있습니다 (예 :빈리스트를 함수의 기본 매개 변수로 사용할 때 이것은 일반적인 초보자의 실수입니다). –

+4

명시 적 테스트'is None'을 드롭하면 기본적으로'** None ** '뿐만 아니라'''(빈 문자열),' []'(비어있는 목록),'{}'(공란),'0','False' (부울). 이것은 어느 시점에서 오류를 잡기가 더 힘들어지는 요인이 될 수 있습니다. – ChristopheD

0

당신은 이런 식으로 할 수있는 :

if not self.name2info[name]['prereqs']: self.name2info[name]['prereqs'] = [] 

또는이 방법

self.name2info[name]['prereqs'] = [] if not self.name2info[name]['prereqs'] else self.name2info[name]['prereqs'] 
+3

'self.name2info [name] [ 'prereqs']'가'None' 대신'False'를 포함하면 어떨까요? 나는 당신이'None x is None'을 가지고 None을 명시 적으로 테스트해야한다고 생각한다. ... – ChristopheD

+0

그가 원하는 것에 달려 있다고 가정한다. (그의 코드에서)'prereqs'가 None이거나리스트이다. 값. 단일 원소리스트 [False]조차도 True와 동일합니다. 물론 OP가 목록이나 None 이외의 값을 저장하려는 경우 올바른 ** 것입니다. 그러나 'prereqs'가 항상 목록에 포함되면 내 방법이 완벽하게 적합합니다. –

1

당신이 입력을 해결할 수없는 경우를 너 이렇게 ('더 나은' 당신은) 더 추가해야하는 경우 :

for prop in ['prereqs', 'optionals']: 
    if self.name2info[name][prop] is None: 
     self.name2info[name][prop] = [] 

그러나이 값을 대체하는 것이 될 당신이 추가하고 어쩌면 경우가 아니면 그냥 (많은 이해하지 않는 추가빈리스트를을 반복 어떤 점에서이 목록에 무엇인가).

prereqs = self.name2info[name]['prereqs'] if prereqs is not None: for prereq in prereqs: do_stuff(prereq) 

이 약간 지금 오프 주제가는, 그러나 당신이 이제까지 테스트하려는 경우 항목은 모두 공통 (파이썬 반복 가능한 경우 : 그래서 어쩌면 당신은 단지 반복 이전 None -ness 권리 테스트를 움직일 수) 방법은 다음과 같이 작성해야합니다.

try: 
    my_iterable_obj = iter(my_obj) 
except TypeError: 
    # not iterable 
0

이러한 속성 및 dict 조회는 모두 시간과 처리가 필요합니다. 그냥 한 번 self.name2info [이름]을 찾아 다음 해당 딕셔너리에 바인딩 임시 이름에서 작동하도록 파이썬을이다 :

rec = self.name2info[name] 
for key in "prereqs optionals required elective distance".split(): 
    if key not in rec or rec[key] is None: 
     rec[key] = [] 

"AP_credit"처럼 다른 카테고리를 추가 할 필요가, 당신은 단지를 추가 이제 경우 키 이름의 문자열에.

0

당신이 반복하는 경우 나는 그들이 목록에 저장되어 있다고 가정합니다. 위의 방법 중 일부를 결합하는 것이 가장 좋을 것입니다.

seq=list(map(lambda x: x or [], seq)) 

간결한 방법입니다. 내 지식으로 map()의 변환은 명시 적 for 루프보다 빠릅니다. 루프가 기본 C 코드에서 실행되기 때문입니다.

관련 문제