2013-06-02 3 views
0

이 까다로운 dict 함수 호출 (pythonic "cases"..)을 "map"과 함께 순환 적으로 다시 작성할 수 있습니까?이주기를지도로 다시 쓸 수 있습니까?

일부 Java 함수 호출이 있습니다. 먼저 "if-elif"문을 사용한 다음 dict를 사용하기로 결정했습니다. 예외없이 dict 사용을 시도했습니다.

필자는 "dict"-calls을 열 반복기에 매핑하여 "for"주기를 다시 작성하려고합니다. 가능한가?

for column in COLUMNS: 
    DATAR[column].append(type_resol.get(STRCT[column], lambda x: None))(column)) 

당신은 또한 한 라인을 넣을 수 있지만, 어쩌면 이미 너무 깁니다 :

type_resolver={'java.lang.String' : set.getString, 
       'java.lang.Integer' : set.getInt, 
       #'java.lang.util.Date' : lambda x: None,#set.getTimestamp, 
       'java.lang.Short' : set.getShort, 
       #'java.util.Collection': lambda x: None, 
       #'java.util.Date': lambda x: None, 
       #'boolean': lambda x: None 
} 

while set.next():      
    for column in COLUMNS: 
     try: 
      data=type_resolver[STRCT[column]](column) 
     except KeyError: 
      data=None 
     DATAR[column].append(data) 
+0

가능한 한 많은 불필요한 코드를 편집하려고했지만 사실은'column'의 값에 따라 다른 목록에 추가된다는 것입니다. 따라서 for 루프가 더 간단한 것으로 대체 될 수 있는지 여부를 알기가 어렵습니다. –

+1

왜 그렇게하고 싶습니까? 어쩌면 당신은'get' :'data = type_resolver.get (STRCT [column], lambda x : None) (column)'을 사용하여 약간의 코드를 단순화하고'try ... except'를 제거 할 수 있습니다. 'map '이 ** 기능 ** 기능이라는 것을 강조하고 싶습니다. 기능적 언어는 가능한 한 부작용을 피하고, 부작용을 두 번 이상 적용하려는 의도로이 기능을 사용하기를 원한다. 이런 종류의 조합은 일반적으로 잘 작동하지 않으며 추악한 코드로 이어집니다. – Bakuriu

+0

while-for 사이클은 내 코드에서 병목 현상의 일종입니다. 나는 맵을 사용하는 것이 "for"사이클을 사용하는 것보다 훨씬 효율적이라고 읽었습니다. 내 생각에, 바쿠 리우가 맞다. 하나의 매핑 문에 너무 많은 자바 함수 = = | 감사합니다 – user2444831

답변

0

대신 KeyError 검사의 get을 사용하여 도움이 또한

[DATAR[column].append(type_resol.get(STRCT[column], lambda x: None))(column)) 
for column in COLUMN] 

, 마지막 변화 그것이 None으로 가득 차 있기 때문에 목록을 버립니다. 오도 ​​된 수 있습니다. 어쨌든 두 줄이 필요합니다. 그래서 첫 번째 해결책을 사용하십시오.

+0

이것은 작동하지 않습니다. 키가 존재하지 않으면'get'은'None'을 리턴합니다. 그러면'TypeError'를 발생시킵니다. 그래서 내 의견에'get (..., lambda x : None) (column)'이라고 썼다. 또한 OP는 목록 내포물이 아닌'map'을 사용하는데 관심이 있었고'map'을 사용하여'map (lambda col : DATAR [col] .append (type_resolver.get (STRCT [col], lambda x : None)) (col)), COLUMNS)' – Bakuriu

+0

힌트를 보내 주셔서 감사합니다. 내 솔루션을 수정했습니다. –

관련 문제