Chuyển đổi danh sách Python với tất cả các chuỗi thành chữ thường hoặc chữ hoa


261

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 sao "trong một lần"? Bạn có suy ngẫm về khả năng nó sẽ vượt qua nhiều lần không?
John Machin

Đầu ra cần phải là gì?
O.rka

Câu trả lời:


440

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 mapchứ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']

12
Chức năng bản đồ hoạt động như mong đợi trong python2, tuy nhiên trong python3, bạn sẽ bọc bản đồ trong một danh sách cũ:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S

39
Đề xuất thứ hai với bản đồ là chính xác nhưng lãng phí. Không có điểm trong việc thực hiện một chức năng lambda . Chỉ cần sử dụngmap(str.lower, ["A","B","C"])
fralau

1
Khi tôi cố gắng in một danh sách sau cuộc gọi này, không có gì thay đổi. Tại sao vậy?
bắt chước

1
@mimic Hơi muộn một chút, nhưng với những người gặp phải vấn đề này, tôi đoán vấn đề của bạn có lẽ là bạn không gán kết quả của việc hiểu danh sách trở lại danh sách của bạn. Chỉ cần làm để hiểu danh sách trả về giá trị, nhưng không gán lại nó cho biến danh sách.
Michael Kolber

52

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

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

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

3
trong python 3, mapchiến thắng cuộc đua, nhưng không làm gì cả :)
Jean-François Fabre

@NedDeily map(str.lower,["A","B","C"])nhanh nhất là python3.7.5
SHIVAM JINDAL


20

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']

2
err, sử dụng listlàm tên biến không phải là lựa chọn tốt nhất :)
Jean-François Fabre

Không, nhưng vì tên ít quan trọng đối với phương thức được hiển thị, nên nó không thực sự phù hợp. 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

sự kỳ diệu của stackoverflow: 250 phiếu cho giải pháp 2 trăn chỉ sử dụng lambda khi không nên !! tốt ngay bây giờ
Jean-François Fabre

@ Jean-FrançoisFabre, không chắc tại sao bạn nghĩ đây là giải pháp chỉ dành cho Python-2. Như bảng điểm cho thấy, nó rõ ràng đang chạy trong Python 3.5.2. Trong thực tế, tôi chỉ kiểm tra lại để xác nhận. ... một thời gian trôi qua trong khi tôi điều tra ... Thật ra, đừng bận tâm, có vẻ như bạn đang nói về câu trả lời được chấp nhận hiện tại thay vì câu trả lời này, vì vậy có lẽ bạn nên bình luận ở đó hơn là ở đây. Không nghi ngờ một sai lầm trung thực. Chúc mừng.
paxdiablo

1
vâng, tôi đã không chỉ trích bạn (ngoài những listthứ đó :)). Bạn nghĩ UV gần đây bạn đến từ đâu? :)
Jean-François Fabre

7

Đố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

5

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

fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
newList = []
for fruit in fruits:
    newList.append(fruit.upper())
print(newList)

3
mylist = ['Mixed Case One', 'Mixed Case Two', 'Mixed Three']
print(list(map(lambda x: x.lower(), mylist)))
print(list(map(lambda x: x.upper(), mylist)))

2

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 ssẽ 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 pthì list ssẽ 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 sthay vì list p.


1

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.lowerhoặc str.upperkhô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

1

Một phiên bản đơn giản hơn nhiều của câu trả lời hàng đầu được đưa ra ở đây bởi @Amorpheuses.

Với một danh sách các giá trị trong val:

valsLower = [item.lower() for item in vals]

Điều này làm việc tốt với tôi với nguồn văn bản f = open ().


1

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)))

0

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)

0

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']
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.