2013-10-22 3 views
0

더 우아한 방법이 있나요?Python : 목록에서 수레를 추출하는 우아한 방법?

나는 형태의 "이중"목록을 가지고 : 나는 형식, 개별 부동 소수점 숫자를 추출하려는

rlist = [([-0.5753647], [1.3716470]), ([-0.57536478], [0.75418190]), ([-1.37632438], [0.57068748])] 

. 순간

내가 사용하고 있습니다 : 예를 들어

first_number = round(float(str(rlist[0][0]).strip('[]')),4) 

, 첫 번째 번호를 얻을 수 있습니다. 이것은 다소 추한 것입니다. 파이썬에서 좀 더 간결한 방법이 있나요?

DN은

답변

2

이 같은 뭔가를 시도 할 수 있습니다 :

from itertools import chain 
[round(x, 4) for x in chain(*chain(*rlist))] 

itertools.chain 중첩 반복 가능 객체를 평평하게하는 데 사용할 수 있습니다. 그런 다음 목록 이해와 round을 사용하여 필수 정밀도가있는 숫자 목록을 얻을 수 있습니다. 중첩 수준)

그리고 라운드 (zero323 @로 please see the comments below this answer 이상이면

1

당신은

f = -0.5753647 

print f 

-0.57536469999999995 

print round(f, 4) 

-0.57540000000000002 

그래서, 너무 또한, itertools.chain()에 대한 몇 가지 제한 사항이 탈퇴하는 경우

rlist = [([-0.5753647], [1.3716470]), 
    ([-0.57536478], [0.75418190]), 
    ([-1.37632438], [0.57068748])] 

def flatten(container): 

    for i in container: 
     if isinstance(i, list) or isinstance(i, tuple): 
      for j in flatten(i): 
       yield j 
     else: 
      yield i 

print ["{0:.4f}".format(ele) for ele in list(flatten(rlist))] 
+0

1. 랜덤 임포트 무작위로부터 이것을 체크한다; 범위 (4)에서 z의 경우 chain (* chain (* chain (* [[범위 (2)의 x에 대해 [[[random()] 범위에 포함)]))' 더 깊은 중첩을 시도하면 잘 작동하는 것을 볼 수 있습니다. 2. 문자열로 변환해도 문제가 해결되지 않으며 @dcnicholls와는 다른 결과가 나옵니다. fp 표현이 실제로 문제가된다면'decimal.Decimal'을 사용할 수 있습니다. 3. isinstance를 사용하는 것은 대개 권장되지 않습니다. 'hasattr (i, "__iter __")'는 아마도 더 나은 해결책 일 것입니다. – zero323

+0

코멘트에서 언급 한 제안은 복잡하고 이해하기 어렵습니다. ** chain() ** 메소드는 다른 내부에서 호출됩니다. 중첩 수준을 인식하지 못하면 어떻게 될까요? –

+0

IMHO 중첩 기능에는 아무 것도 복잡하지 않지만 아마도 맛의 문제 일 것입니다. 보금 자리를 알지 못하는 것에 대해서. 이 질문의 문맥에서는 형식이 고정되어 있기 때문에 실제로 중요하지 않습니다. 그러나 일반적으로 말하는 재귀는이 경우 위험 할 수 있습니다. 그 말은 '체인'보다 훨씬 느립니다. 이것을 실행 해보자 :'from random import randint; 범위 (1000)에있는 y의 경우 foo = [[[[randint (1,10)]] 범위 (1000)의 z의 경우]]; % timeit list (chain (* chain (* chain (* foo)))); % timeit list (flatten (foo))'라고 표시됩니다. – zero323

관련 문제