2016-09-09 1 views
-3

파이썬 2.7을 사용하여이 코드 줄을 줄이거 나 최적화하고 싶지만 아무 문제가 없습니다.Python 오류 코드 줄을 최적화하려고 할 때

나는 단지

  • 는 하이픈 후 바로 참여하세요 B에서 4 번째 값과
  • 가 B로 다시 가져 때로는 공간을하려면이 목록을 B = [[0, Act1, XX1, u'P-Um'],.....[0, Act100, ZZ30, u'D- MOM']]

    지금이 코드를 작성했습니다

    for i in range(len(B)): 
         x.append(B[i][3]) 
         A = [i.split('-',1)[1] for i in x] 
         #A=[u'Um', u' LY', u' NO', ......, u' MOM']    
        for i in range(len(B)): 
         A[i].lstrip() 
         p = [] 
         for i in range(len(B)): 
          p.append(A[i].lstrip()) 
         for i in range(len(B)): 
          B[i][3] = p[i] 
    

    다음과 같이 짧게 만들려고하면 두 가지 오류가 발생합니다.

    #Short version 
    
    for i in range(len(B)): 
         x.append(B[i][3]) 
         A = [i.split('-',1)[1], x] #Error:AttributeError: 'int' object has no   attribute 'split' 
         B[i][3].append(A[i].lstrip()) #Error:AttributeError: 'unicode' object has no attribute 'append' 
    

    나는 오류를 풀기 위해 여러 방법을 시도하지만 여전히 작동하지 않습니다. 제발 도와 주실 래요? 윗부분을 오류없이 짧게 만들 수 있다고 생각하십니까?

    대단히 감사합니다.

  • +1

    정지를 중첩 루프를 사용할 때 변수의 이름으로'i'를 사용하여, 당신은 항상 그 값 – RafaelC

    +0

    을이 코드는 다소 어려운 것입니다 덮어 쓰기있어 한 문자 변수 이름을 사용하기 때문에 이해합니다. 변수에 설명적인 이름을 사용하는 것이 좋습니다 (일반적으로). –

    +0

    목록이 작동하지 않습니다. 변수, 정수 및 문자열이 있습니다 ...그런 다음, 당신은'range'에 의해 반환 된 인덱스를 분리하고 있습니다 : 안돼, 그럼 당신은 당신의 유니 코드리스트 객체 중 하나에 추가하고 있습니다 : 절대 안됩니다 ... 불분명합니다 ... –

    답변

    0

    당신은 지능형리스트 사용할 수 있습니다

    B=[[B_element[0],B_element[1],B_element[2],B_element[3].split('-',1)[1].lstrip()] for B_element in B] 
    
    0

    난 당신이 시도한 여러 가지 방법을 확인할 수 없습니다,하지만 당신의 코드는 잘못하면의 소수를 가지고있다. 들여 쓰기 오류를 수정 한 후에도 첫 번째 변형은 네 번 필요하지 않은 인덱스를 반복하고 모든 항목을 두 번 스트립합니다 (두 번째 결과 만 사용). 두 번째 버전은 먼저 인덱스가 항목이 아니기 때문에 실패합니다. 둘째로 문자열을 바꾸는 대신 문자열을 변경하려고하기 때문입니다. 실제로 성능이 필요하면 그 기능을 호출 할 때마다 새로운 문자열을 생성하기 때문에

    A=[] 
    x=[] 
    for Bi in B: 
        Bi3 = Bi[3] 
        part = Bi3.split('-',1)[1].lstrip() 
        x.append(Bi3)  # Original B[i][3] data 
        A.append(part)  # What is this for? 
        Bi[3] = part  # replaces B[i][3] 
    

    , 그것은 매우 가능성이 정규 표현식은보다 효율적으로 분리/스트립 조합보다 부분을 추출 할 수 있습니다.

    0

    B를 반복 처리하기 위해 B 항목의 색인을 생성 할 필요가 없습니다. 이것은 도움이 될 수 있습니다.

    >>> Act1 = XX1 = Act100 = ZZ30 = None # simply to avoid NameError exceptions 
    >>> B = [[0, Act1, XX1, u'P-Um'],[0, Act100, ZZ30, u'D- MOM']] 
    >>> result = [b[3].split('-')[1].strip() for b in B] 
    >>> result 
    ['Um', 'MOM'] 
    

    result

    는, B의 각 항목의 요소 (3)를 취하는 '-'에 분할하고, 분할 된 문자열의 소자 (1)로부터 앞뒤 공간을 박리에 의해 생성 된리스트이다. 내가 사용한 기술은 list comprehension입니다.

    그런 다음 네 번째 요소를 이러한 새 값으로 바꾸려면이를 수행하는 한 가지 방법이 있습니다.

    >>> final = [] 
    >>> for b, r in zip(B, result): 
    ...  final.append([b[0], b[1], b[2], r]) 
    ... 
    >>> final 
    [[0, None, None, 'Um'], [0, None, None, 'MOM']] 
    

    그럼 그냥 finalB 교체 :

    >>> B = final 
    
    관련 문제