2012-03-05 49 views
11
x = ['Some strings.', 1, 2, 3, 'More strings!', 'Fanc\xc3\xbf string!'] 
y = [i.decode('UTF-8') for i in x] 

Cách tốt nhất để chuyển đổi chuỗi trong x thành Unicode là gì? Việc nén danh sách sẽ gây ra lỗi thuộc tính (AttributeError: 'int' object has no attribute 'decode') vì int không có phương thức giải mã.Trong Python, làm cách nào để chuyển đổi danh sách các chuỗi và chuỗi thành Unicode?

Tôi có thể sử dụng vòng lặp for để thử? Hoặc tôi có thể làm một số loại kiểm tra rõ ràng trong danh sách nén, nhưng là loại kiểm tra trong một ngôn ngữ năng động như Python cách tiếp cận đúng?

CẬP NHẬT:

Tôi muốn int vẫn là int. Mặc dù đây không phải là một yêu cầu nghiêm ngặt. Sản lượng lý tưởng của tôi sẽ là [u'Some strings.', 1, 2, 3, u'More strings!', u'Fancÿ string!'].

+4

đầu ra mong muốn của bạn là gì? '[uMột số chuỗi ', 1, 2, 3, u'Hai chuỗi!']', '[uMột số chuỗi ', u'1', u'2 ', u'3', u'Nhiều chuỗi ! '] ',' [uMột số chuỗi', u'Hai dây! '] '? –

Trả lời

11

Nếu bạn muốn giữ nguyên như họ đang có trong danh sách, trong khi chỉ cần thay đổi xâu kí tự sang unicode, bạn có thể làm

x = ['Some strings.', 1, 2, 3, 'More strings!'] 
y = [i.decode('UTF-8') if isinstance(i, basestring) else i for i in x] 

mà được bạn

[u'Some strings.', 1, 2, 3, u'More strings!'] 
+0

Bạn cũng có thể làm điều này bằng cách sử dụng một vòng lặp và một khối try/catch, nhưng tôi nghĩ rằng đây là tidier. – cjm

+2

Khối try/catch sẽ hoạt động trên các đối tượng có phương thức giải mã, nhưng không phải là trường hợp của basestring. Mà bảo tồn một tính năng của ngôn ngữ động: bạn không phải làm rất nhiều loại kiểm tra và thừa kế ưa thích. – Buttons840

+0

Vâng, đó là một sự thỏa hiệp giữa ngắn gọn và lập trình sử dụng triết lý năng động. Tôi nghĩ rằng bạn nên tránh sử dụng try/catch để kiểm soát luồng nếu bạn có thể giúp nó, nhưng cả hai giải pháp có thể phù hợp tùy thuộc vào suy nghĩ/tình huống của bạn. – cjm

11

Bạn có thể sử dụng unicode chức năng:

>>> x = ['Some strings.', 1, 2, 3, 'More strings!'] 
>>> y = [unicode(i) for i in x] 
>>> y 
[u'Some strings.', u'1', u'2', u'3', u'More strings!'] 

CẬP NHẬT: kể từ khi bạn đã xác định rằng bạn muốn các số nguyên để duy trì như nó vốn có, tôi sẽ sử dụng này:

>>> y = [unicode(i) if isinstance(i, basestring) else i for i in x] 
>>> y 
[u'Some strings.', 1, 2, 3, u'More strings!'] 

Lưu ý: như @Boldewyn chỉ ra, nếu bạn muốn UTF-8, bạn nên chuyển thông số encoding cho hàm unicode:

unicode(i, encoding='UTF-8') 
+1

Điều này chỉ hoạt động cho ASCII ('decode()' là có cho một mục đích). Và nó chuyển đổi các số để gõ 'unicode'. – Boldewyn

+0

Điều này làm việc cho unicode quá, không chỉ ASCII. – jterrace

+0

* Chỉ * nếu bạn thông báo cho trình thông dịch Python qua '- * - coding - * -' pragmas. Và Unicode! = UTF-8, xin lỗi. – Boldewyn

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