2009-04-27 3 views
13

목록 이해에서 생성 된 이전 요소에 액세스 할 수 있습니까?파이썬 목록 이해 - 마지막으로 생성 된 요소에 액세스 하시겠습니까?

일부 장난감 암호화 작업을하고 있습니다. 키를 임의로 큰 정수, 초기화 값 및 암호화 할 메시지로 요소 목록으로 지정하십시오. 이전의 암호화 된 요소와 키를 사용하여 각 요소를 xor해야합니다. 다음 루프가 수행합니다. 이 지능형리스트로이 회전 할 수 있어야하지만 초기 값 또는 발생 이전 값에 접근을 모두 처리하는 방법을 정확히 모르겠습니다처럼

previous = initialization_value 
cipher = [] 
for element in message: 
    previous = element^previous^key 
    cipher.append(previous) 

는 느낌. 가능합니까? 그렇다면 이해력은 무엇입니까?

답변

14

목록 이해력으로이를 수행하는 좋은 방법이 없습니다. 목록 보급에 대해 생각하는 가장 좋은 방법은 mapfilter을 대신하는 것입니다. 당신이

  • 그 요소 중 일부를 제거합니다 (예 : 요소를 제곱) 일부 표현에 대한 입력과 같은 요소를 사용하여 목록과

    • 을해야 할 때마다 즉, 지능형리스트를 사용하십시오 일부 조건에 따라

    이러한 것들은 공통적으로 한 번에 하나의 목록 요소 만 봅니다. 이는 엄지 손가락의 좋은 규칙입니다. 비록 당신이 이론적으로 당신이 목록 이해력으로 보여준 코드를 쓸 수 있다고해도, 어색하고 어색 할 것입니다.

    말했다되고 그건
    class Encryption: 
        def __init__(self, key, init_value): 
        self.key = key 
        self.previous = init_value 
        def next(self, element): 
        self.previous = element^self.previous^self.key 
        return self.previous 
    
    enc = Encryption(...) 
    cipher = [enc.next(e) for e in message] 
    

    에서, XOR로 이전에 암호화 된 요소를 추가하는 것은 어렵지로 알고리즘을하지 않습니다 순서 반복하면서

  • +5

    +1 : 우리는 여전히 for 문을 이유입니다 - 바로이 질문에 같은 상황. –

    1

    당신은 모든 내부 상태를 저장하는 도우미 개체를 사용할 수 있습니다 그냥 열쇠로 모든 요소를 ​​xor'ing보다 휴식. 공격자는 이전의 암호화 된 문자로 암호 텍스트의 모든 문자를 xor 만 할 수 있으므로 암호화 중에 수행 된 xor를 취소 할 수 있습니다.

    3

    reduce()을 사용하여이 작업을 수행 할 수 있습니다. 목록 이해가 아닌 기능 스타일 접근 방식입니다.

    cipher = [] 
    def f(previous, element): 
        previous = element^previous^key 
        cipher.append(previous) 
        return previous 
    reduce(f, message, initialization_value) 
    

    이 경우 일반 루프보다 더 예쁜 것은 아닙니다.

    +1

    reduce를 사용하기 전에 성능을 점검하십시오. 그것은 종종 비효율적 인 구조로 이어질 수 있습니다. –

    +1

    'for 루프'버전은 * 훨씬 더 깨끗합니다. 따라서이 답변은 이론적으로 달리 할 수 ​​있습니다. –

    3

    :

    def cypher(message, key, seed): 
        for element in message: 
         seed = element^seed^key 
         yield seed 
    
    list(cypher(message, key, initial_seed)) 
    
    +0

    OP가 요청한 내용이 아니더라도이 솔루션이 마음에 듭니다. – MaLiN2223