2013-01-22 2 views
2

질문을 받았지만 "발전기 이해만으로 사용"하게 될 것입니다.else 절이있는 필터 (numpy.where)

(x if c else y for c, x, y in zip(cs, xs, ys)) 

를 들어 응답,하지만 어딘가 표준 라이브러리에 있고 난 그냥 파이썬 3.x의에서

... itertools에서 찾을 수없는 경우를 대비하는 기능 대안은있다 예를 들어, numpy.where(cs, xs, ys) 정확하게 이것을합니다.

+0

'numpy.where (cs, xs, ys)'의 문제점은 무엇입니까? 표준 언어가 아닌 경우 적절한 라이브러리를 사용하거나 제안한 방법을 작성하십시오. – eumiro

답변

2

그것은 발전기 표현, 그래서 그냥 랩을 해제 :

cs = [True, False, True] 
xs = [1, 2, 3] 
ys = [10, 20, 30] 

def generator(cs, xs, ys): 
    for c, x, y in zip(cs, xs, ys): 
     yield x if c else y 

print(list(x if c else y for c, x, y in zip(cs, xs, ys))) 
print(list(generator(cs, xs, ys))) 

출력 :

[1, 20, 3] 
[1, 20, 3] 
+0

내 자신의 이익을 위해 : for 문에서 zip과 itertools.izip을 사용하는 데 차이가 있습니까? – BenDundee

+0

파이썬 3에서 나는 그것을 사용할 수 없다. 파이썬 2에서,'ixip()'는'zip()'와 비슷하지만 목록 대신에 반복자를 반환합니다. 파이썬 3의'itertools'에서 이미 사라졌습니다. 왜냐하면 그 버전에서'zip()'이 이미하고 있기 때문입니다. 기술적으로 iterator 객체는 생성자 객체입니다. 귀하의 질문에'python-3.x' 태그가 있기 때문에 나는이 모든 것을 언급하는 것을 귀찮게하지 않았습니다. – martineau

1

흠, 어때? (. 내가 파이썬 2.7.3에있어,하지만 난 그것을 여기에 중요한 생각하지 않는다)

>>> import itertools as it 
>>> a=[1,2,3] 
>>> b=[10,20,30] 
>>> cond=[True, False, True] 
>>> func=lambda c,x,y: x if c else y 
>>> test=it.starmap(func, it.izip(cond,a,b)) 
>>> test.next() 
1 
>>> test.next() 
20 
>>> test.next() 
3 
관련 문제