Tôi có một biến danh sách python có chứa chuỗi. Có một hàm python có thể chuyển đổi tất cả các chuỗi trong một lần chuyển thành chữ thường và ngược lại, chữ hoa không?
Tôi có một biến danh sách python có chứa chuỗi. Có một hàm python có thể chuyển đổi tất cả các chuỗi trong một lần chuyển thành chữ thường và ngược lại, chữ hoa không?
Câu trả lời:
Nó có thể được thực hiện với sự hiểu biết danh sách. Những điều này về cơ bản có hình thức [function-of-item for item in some-list]
. Ví dụ: để tạo một danh sách mới trong đó tất cả các mục được đặt ở mức thấp hơn (hoặc được đặt ở trên trong đoạn mã 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']
list(map(lambda x:x.upper(),["a","b","c"]))
map(str.lower, ["A","B","C"])
Bên cạnh việc dễ đọc hơn (đối với nhiều người), danh sách hiểu cũng giành chiến thắng trong cuộc đua tốc độ:
$ 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
map
chiến thắng cuộc đua, nhưng không làm gì cả :)
map(str.lower,["A","B","C"])
nhanh nhất là python3.7.5
>>> map(str.lower,["A","B","C"])
['a', 'b', 'c']
str.upper
để chuyển sang chữ hoa
Hiểu danh sách là cách tôi thực hiện, đó là cách "Pythonic". Bảng điểm sau đây cho thấy cách chuyển đổi danh sách sang tất cả chữ hoa rồi quay lại chữ thường:
pax@paxbox7:~$ 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']
list
làm tên biến không phải là lựa chọn tốt nhất :)
list
thứ đó :)). Bạn nghĩ UV gần đây bạn đến từ đâu? :)
Đối với mẫu này, sự hiểu biết là nhanh nhất
$ python -m timeit -s 's = ["one", "hai", "ba"] * 1000' '[x.upper cho x in s]' 1000 vòng, tốt nhất là 3: 809 usec mỗi vòng $ python -m timeit -s 's = ["one", "hai", "ba"] * 1000' 'map (str.upper, s)' 1000 vòng, tốt nhất là 3: 1,12 msec mỗi vòng $ python -m timeit -s 's = ["one", "hai", "ba"] * 1000' 'map (lambda x: x.upper (), s)' 1000 vòng, tốt nhất là 3: 1,77 msec mỗi vòng
Giải pháp:
>>> s = []
>>> p = ['This', 'That', 'There', 'is', 'apple']
>>> [s.append(i.lower()) if not i.islower() else s.append(i) for i in p]
>>> s
>>> ['this', 'that', 'there', 'is','apple']
Giải pháp này sẽ tạo một danh sách riêng có chứa các mục chữ thường, bất kể trường hợp ban đầu của chúng. Nếu trường hợp ban đầu là trên thì list s
sẽ chứa chữ thường của mục tương ứng trong list p
. Nếu trường hợp ban đầu của mục danh sách đã được viết thường list p
thì list s
sẽ giữ lại trường hợp của mục đó và giữ nó ở dạng chữ thường. Bây giờ bạn có thể sử dụng list s
thay vì list p
.
Nếu mục đích của bạn là khớp với một chuỗi khác bằng cách chuyển đổi trong một lần, bạn cũng có thể sử dụng str.casefold()
.
Điều này hữu ích khi bạn có các ký tự không phải mã ascii và khớp với các phiên bản ascii (ví dụ: maße vs masse). Quá str.lower
hoặc str.upper
không thành công trong các trường hợp như vậy, str.casefold()
sẽ vượt qua. Điều này có sẵn trong Python 3 và ý tưởng được thảo luận chi tiết với câu trả lời https://stackoverflow.com/a/31599276/4848659 .
>>>str="Hello World";
>>>print(str.lower());
hello world
>>>print(str.upper());
HELLO WOLRD
>>>print(str.casefold());
hello world
Bạn có thể thử sử dụng:
my_list = ['india', 'america', 'china', 'korea']
def capitalize_list(item):
return item.upper()
print(list(map(capitalize_list, my_list)))
Python3.6.8
In [1]: a = 'which option is the fastest'
In [2]: %%timeit
...: ''.join(a).upper()
762 ns ± 11.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [3]: %%timeit
...: map(lambda x:x.upper(), a)
209 ns ± 5.73 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [4]: %%timeit
...: map(str.upper, [i for i in a])
1.18 µs ± 11.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [5]: %%timeit
...: [i.upper() for i in a]
3.2 µs ± 64.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Nếu bạn cần một chuỗi hoặc danh sách làm đầu ra chứ không phải là một trình vòng lặp (đây là cho Python3), hãy so sánh ''.join(string).upper()
tùy chọn này:
In [10]: %%timeit
...: [i for i in map(lambda x:x.upper(), a)]
4.32 µs ± 112 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Nếu bạn đang cố gắng chuyển đổi tất cả chuỗi thành chữ thường trong danh sách, Bạn có thể sử dụng gấu trúc:
import pandas as pd
data = ['Study', 'Insights']
pd_d = list(pd.Series(data).str.lower())
đầu ra:
['study', 'insights']