2009-04-27 40 views
13

Có thể truy cập phần tử trước được tạo trong một danh sách hiểu.Đọc danh sách Python - truy cập phần tử được tạo cuối cùng?

Tôi đang làm việc với một số công cụ mã hóa đồ chơi. Cho khóa như là một số nguyên lớn tùy ý, một giá trị khởi tạo và một danh sách các phần tử như thông điệp để mã hóa. Tôi cần xor từng phần tử với phần tử mã hóa trước đó và khóa. Vòng lặp sau đây sẽ làm.

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

Tôi cảm thấy có thể biến điều này thành danh sách nhưng tôi không chắc chắn cách xử lý cả giá trị ban đầu hoặc truy cập giá trị trước đó được tạo. Có thể và nếu vậy thì hiểu biết sẽ là gì?

Trả lời

14

Không có cách nào tốt, Pythonic để làm điều này với một danh sách hiểu. Cách tốt nhất để suy nghĩ về việc hiểu danh sách là thay thế cho mapfilter. Nói cách khác, bạn muốn sử dụng một danh sách hiểu bất cứ khi nào bạn cần phải thực hiện một danh sách và

  • Sử dụng yếu tố của nó như là đầu vào đối với một số biểu thức (ví dụ như bình phương các yếu tố)

  • Hủy bỏ một số phần tử của nó dựa trên một số điều kiện

Những điểm chung này có nghĩa là mỗi người chỉ xem xét một phần tử danh sách duy nhất tại một thời điểm. Đây là một nguyên tắc tốt; ngay cả khi bạn về mặt lý thuyết có thể viết mã bạn đã cho thấy dưới dạng một danh sách hiểu, nó sẽ là vụng về và không hề đáng sợ.

+5

+1: Đó là lý do tại sao chúng ta vẫn có câu lệnh for - cho các tình huống giống hệt như câu hỏi này. –

1

Bạn có thể sử dụng một đối tượng helper để lưu trữ tất cả các trạng thái nội bộ trong khi iterating trên chuỗi:

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] 

đó đang được nói, thêm các yếu tố được mã hóa trước đó vào xor không thực hiện thuật toán của bạn bất kỳ khó phá vỡ hơn là chỉ xor'ing mọi phần tử với khóa. Kẻ tấn công có thể chỉ xor bất kỳ ký tự nào trong văn bản mật mã với ký tự được mã hóa trước đó và do đó hủy bỏ xor đã được thực hiện trong quá trình mã hóa.

3

Bạn có thể thực hiện việc này bằng cách sử dụng reduce(). Đây không phải là danh sách hiểu, nhưng đó là cách tiếp cận theo phong cách chức năng:

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

Nó không đẹp hơn vòng lặp đơn giản trong trường hợp này.

+1

Kiểm tra hiệu suất trước khi sử dụng giảm; nó thường có thể dẫn đến cấu trúc đáng kể không hiệu quả. –

+1

Phiên bản 'for loop' là * nhiều * sạch hơn, vì vậy hãy coi câu trả lời này chỉ như một "lý thuyết có thể làm khác". –

3

Như một máy phát điện:

def cypher(message, key, seed): 
    for element in message: 
     seed = element^seed^key 
     yield seed 

list(cypher(message, key, initial_seed)) 
+0

Tôi thích giải pháp này mặc dù nó không phải là những gì OP hỏi. – MaLiN2223

Các vấn đề liên quan