2009-11-26 51 views
136

Tôi có biến danh sách python có chứa chuỗi. Có chức năng python nào có thể chuyển đổi tất cả các chuỗi trong một lần sang chữ thường và ngược lại, chữ hoa?Chuyển đổi danh sách Python bằng chuỗi thành chữ thường hoặc chữ hoa

+0

Tại sao "trong một lần"? Bạn có suy nghĩ về khả năng của nó lấy nhiều vé? –

+21

"trong một lượt" có mùi giống như ngôn ngữ bài tập ở nhà –

Trả lời

249

Có thể thực hiện với tính năng hiểu danh sách. Về cơ bản, chúng có dạng là [function-of-item for item in some-list]. Ví dụ, để tạo một danh sách mới, nơi tất cả các mục được thấp-cased (hoặc phía trên cased trong đoạn thứ hai), bạn sẽ sử dụng:

>>> [x.lower() for x in ["A","B","C"]] 
['a', 'b', 'c'] 

>>> [x.upper() for x in ["a","b","c"]] 
['A', 'B', 'C'] 

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

>>> map(lambda x:x.lower(),["A","B","C"]) 
['a', 'b', 'c'] 
>>> map(lambda x:x.upper(),["a","b","c"]) 
['A', 'B', 'C'] 
+3

Chức năng bản đồ hoạt động như mong đợi trong python2, tuy nhiên trong python3 bạn quấn bản đồ vào danh sách cũ: 'list (map (lambda x: x.upper(), [" a "," b "," c "]))' –

+3

Đề xuất thứ hai với ** bản đồ ** là chính xác nhưng lãng phí. Có ** không có điểm trong việc tạo ra hàm lambda **. Chỉ cần sử dụng 'map (str.lower, [" A "," B "," C "])' – fralau

12

Đọc danh sách là cách tôi làm, đó là cách "Pythonic". Bảng điểm sau đây cho thấy làm thế nào để chuyển đổi một danh sách cho tất cả các trường hợp trên sau đó trở lại thấp hơn:

[email protected]:~$ python3 
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux 
Type "help", "copyright", "credits" or "license" for more information. 

>>> x = ["one", "two", "three"] ; x 
['one', 'two', 'three'] 

>>> x = [element.upper() for element in x] ; x 
['ONE', 'TWO', 'THREE'] 

>>> x = [element.lower() for element in x] ; x 
['one', 'two', 'three'] 
+0

err, sử dụng 'list' như một tên biến không phải là lựa chọn tốt nhất :) –

+0

Không, nhưng kể từ cái tên ít quan trọng đối với phương pháp được hiển thị, nó không thực sự có liên quan. Tuy nhiên, tôi sẽ thay đổi tên trong trường hợp ai đó muốn sử dụng mã như vậy. – paxdiablo

+0

sự kỳ diệu của stackoverflow: 250 phiếu cho một giải pháp 2-python chỉ sử dụng lambda nơi nó không nên !! cũng 249 bây giờ –

1
mylist = ['Mixed Case One', 'Mixed Case Two', 'Mixed Three'] 
print map(lambda x: x.lower(), mylist) 
print map(lambda x: x.upper(), mylist) 
22
>>> map(str.lower,["A","B","C"]) 
['a', 'b', 'c'] 
+0

rõ ràng là 'str.upper' để chuyển đổi thành chữ hoa –

+4

sẽ không hoạt động tốt trên các chuỗi unicode trong python 2 – mhawke

39

Bên cạnh đó là dễ dàng hơn để đọc (đối với nhiều người), danh sách comprehensions giành chiến thắng trong cuộc đua tốc độ, quá :

$ python2.6 -m timeit '[x.lower() for x in ["A","B","C"]]' 
1000000 loops, best of 3: 1.03 usec per loop 
$ python2.6 -m timeit '[x.upper() for x in ["a","b","c"]]' 
1000000 loops, best of 3: 1.04 usec per loop 

$ python2.6 -m timeit 'map(str.lower,["A","B","C"])' 
1000000 loops, best of 3: 1.44 usec per loop 
$ python2.6 -m timeit 'map(str.upper,["a","b","c"])' 
1000000 loops, best of 3: 1.44 usec per loop 

$ python2.6 -m timeit 'map(lambda x:x.lower(),["A","B","C"])' 
1000000 loops, best of 3: 1.87 usec per loop 
$ python2.6 -m timeit 'map(lambda x:x.upper(),["a","b","c"])' 
1000000 loops, best of 3: 1.87 usec per loop 
+3

Bạn có biết lý do đằng sau việc hiểu danh sách nhanh hơn bản đồ không? – Nixuz

+4

Nó không phải lúc nào cũng nhanh hơn. Đây là một ví dụ mà nó không phải là: http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map Nhưng nó không * nhiều * chậm hơn trong trường hợp đó. Sử dụng lambda rõ ràng tạo nên sự khác biệt lớn. Có nhiều ví dụ về lý do tại sao nó nguy hiểm để tin tưởng trực giác của bạn về các vấn đề hiệu suất, đặc biệt là trong Python. –

+0

trong python 3, 'map' thắng cuộc đua, nhưng không có gì :) –

4

Đối với mẫu này hiểu là nhanh nhất

 
$ python -m timeit -s 's=["one","two","three"]*1000' '[x.upper for x in s]' 
1000 loops, best of 3: 809 usec per loop 

$ python -m timeit -s 's=["one","two","three"]*1000' 'map(str.upper,s)' 
1000 loops, best of 3: 1.12 msec per loop 

$ python -m timeit -s 's=["one","two","three"]*1000' 'map(lambda x:x.upper(),s)' 
1000 loops, best of 3: 1.77 msec per loop 
1

một học sinh hỏi, một học sinh khác có cùng một vấn đề trả lời :))

fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon'] 
newList = [] 
for fruit in fruits: 
    newList.append(fruit.upper()) 
print(newlist) 
Các vấn đề liên quan