Tôi giả định rằng bằng "chuỗi nhị phân", bạn thực sự ngụ ý một chuỗi bình thường (ví dụ: văn bản) có các mục là '0' hoặc '1'.
Vì vậy, cho điểm 1 và 2,
row = [thestring[i:i+3] for i in xrange(0, len(thestring), 3)]
dĩ nhiên mục cuối cùng sẽ dài chỉ có 1 hoặc 2 ký tự nếu len(thestring)
không chính xác là bội của 3, đó là không thể tránh khỏi ;-).
Đối với điểm 3 và 4, tôi muốn đề nghị xây dựng một từ điển tạm thời phụ trợ và lưu trữ nó:
aux = {}
for x in range(8):
s = format(x, 'b')
aux[s] = x
aux[('00'+s)[-3:]] = x
để chỉ 3 và 4 chỉ trở thành:
numbers = [aux[x] for x in row]
tra cứu dict này nên nhanh hơn nhiều so với việc chuyển đổi từng mục nhập một cách nhanh chóng.
Chỉnh sửa: tôi đã giải thích tại sao tôi tạo hai mục nhập thành aux
cho mỗi giá trị x
. Vấn đề là s
có thể có độ dài từ 1 đến 3 ký tự và cho độ dài ngắn, tôi muốn hai mục - một với s
vì nó (vì như tôi đã đề cập mục cuối cùng trong row
cũng có thể ngắn hơn 3 ...) và một có đệm bên trái ở độ dài 3 với 0
s.
Tiểu biểu ('00'+s)[-3:]
tính "s trái độn với 'của 0 đến chiều dài của 3" bằng cách lấy 3 ký tự cuối cùng (đó là phần [-3:]
cắt) của chuỗi thu được bằng cách đặt số không bên trái của s
(đó là phần '00'+s
). Nếu s
đã dài 3 ký tự, toàn bộ biểu thức con sẽ bằng s
do đó việc gán cho mục nhập đó là aux
là vô dụng nhưng vô hại, vì vậy tôi thấy việc kiểm tra đơn giản hơn (thậm chí trước một số if len(s)<3:
cũng không sao; -).
Có các cách tiếp cận khác (ví dụ: định dạng x
một lần nữa nếu cần) nhưng đây không phải là điểm then chốt của mã (nó chỉ thực hiện 8 lần để xây dựng bảng tra cứu phụ, sau khi tất cả ;-), vì vậy tôi đã không 't trả nó đủ sự chú ý.
... Tôi cũng không kiểm tra đơn vị, vì vậy nó có lỗi trong một trường hợp góc tối nghĩa. Bạn có thể thấy nó...?
Giả sử row
có '01'
như mục cuối cùng: RẰNG quan trọng, sau khi mã của tôi ấy trên đã xây dựng aux
, sẽ không có mặt trong aux
(cả 1
và 001
SẼ được, nhưng đó là ít ỏi ủi ;-). Trong đoạn mã trên, tôi sử dụng s
, '1'
và phiên bản đệm ba chiều, '001'
, nhưng phiên bản đệm hai chiều trung gian, oops, bị bỏ qua ;-).
Vì vậy, đây là một cách đúng đắn để làm điều đó ...:
aux = {}
for x in range(8):
s = format(x, 'b')
aux[s] = x
while len(s) < 3:
s = '0' + s
aux[s] = x
... không có nghi ngờ đơn giản và rõ ràng hơn, nhưng, thậm chí quan trọng hơn, ĐÚNG ;-).
và ** cách ** bạn đang cố thực hiện việc này? hoặc chúng ta chỉ cần cung cấp cho bạn c0dez? – SilentGhost
Tôi sẽ đăng những gì tôi có cho đến nay, mặc dù nó có thể là sai cách để làm điều đó. – AME