2014-10-23 3 views
2

나는이 질문을스칼라에서 len을 사용하는 가장 파이썬적인 방법은 무엇입니까?

python: how to identify if a variable is an array or a scalar

을 읽을 수는 있지만 다음 코드를 사용하는 경우 아래 입증 할 수있는 나는 np.array에 거짓을 얻을.

import collections 

isinstance(np.arange(10), collections.Sequence) 
# returns false 

나는 그것이 약간 성가신 내가 len(1)을 단순히 1을 얻을 수없는 것을 찾을 수 있습니다.

a = 1 
try: 
    print len(a) 
except TypeError: 
    print 1 

이 할 수있는 더 파이썬 방법이 있나요 : 내가 생각할 수있는 주위

유일한 작업은 다음과 같은 try except 문을입니까?

+3

* 적어도 * 예외를 인정하십시오. 여기서'TypeError'만이 잡힐 필요가 있습니다. 그런데 어떻게 처음부터 그런 유형의 혼합이 필요한 상황에 처하게 되었습니까? –

+0

특히 numpy를 언급하는 링크의 두 번째 대답에 문제가 있습니까? –

+0

@ Mark Ranson hm. 나는 그것이 아마 작동한다고 생각한다. 나는 누군가가 이런 종류의 일을하는 np.len (a)과 같은 것이 있다는 것을 확실히 말할 것이라고 기대하고 있었다. 거기에없는 것 같습니다. – evan54

답변

6

collections.Sequence은 매우 특정한 유형의 반복 가능한 객체 인 시퀀스 객체에만 적용됩니다. 덧붙여 말하면 numpy.ndarray (이는 numpy.arange에 의해 반환 됨)은 시퀀스가 ​​아닙니다.

당신은 어떤 반복 가능한 개체를 나타내는 하나 collections.Iterable, 테스트해야합니다

>>> isinstance([1, 2, 3], collections.Iterable) 
True 
>> isinstance(np.arange(10), collections.Iterable) 
True 
>>> isinstance(1, collections.Iterable) 
False 
>>> 

또는 collections.Sized, len와 함께 작동 모든 개체 대표 :

>>> isinstance([1, 2, 3], collections.Sized) 
True 
>>> isinstance(np.arange(10), collections.Sized) 
True 
>>> isinstance(1, collections.Sized) 
False 
>>> 

그런 다음 조건을 사용할 수 있습니다 표현식 또는 원하는대로 수행 할 수 있습니다.

print len(a) if isinstance(a, collections.Iterable) else 1 

print len(a) if isinstance(a, collections.Sized) else 1 

collections 모듈에서 사용 가능한 추상 기본 클래스의 전체 목록은 Python 문서의 Collections Abstract Base Classes을 참조하십시오.

+0

'len'이 작동하는지 여부를 알고 싶다면'collections.Sized'가 더 일반적입니다. 그러나 OP가 실제로 객체로 수행하고자하는 작업에 따라 다릅니다. –

+0

'collections.Sized'는 좀 더 일반적인 것처럼 보일 것 같아요. 이런 종류의 기능이'numpy' 나 smth와 비슷한 형태로 존재하지 않는다는 것에 놀랐습니다. – evan54

3

나는 또 다른 잠재적 인 옵션에 던질거야 :

length = getattr(obj, '__len__', lambda:1)() 

그럼 당신의 결과를 얻기 위해 호출, 객체에서 __len__ 방법, 또는 항상 1을 반환하는 함수 중 하나를 얻을.

필자는 Pythonic이라고 말하지는 않겠지 만 가져 오기 및 예외 처리는 피할 수 있습니다. 그러나, 나는 여전히 그것이 collections.Sized이고 조건문이 맞는지 비교하고, len_or_1 또는 뭐라 불리는 도우미 함수에 넣을 것이다. 스칼라, 목록 및 행렬 작업을해야 동작을 제공

import numpy as np 
a = 1 
aSh = np.shape(a) 
if len(aSh) == 0: 
    print 1 
else: 
    print max(aSh) 

: 그것은 여기 NumPy와 사용이 일을하는 또 다른 깔끔한 방법으로이 있지만

0

는 파이썬이 아니다.