แปลงรายการ Python ด้วยสายอักขระทั้งหมดเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่


261

ฉันมีตัวแปรรายการหลามที่มีสตริง มีฟังก์ชันไพ ธ อนที่สามารถแปลงสตริงทั้งหมดในหนึ่งรอบเป็นตัวพิมพ์เล็กและในทางกลับกันเป็นตัวพิมพ์ใหญ่หรือไม่?


ทำไม "ในครั้งเดียว" คุณพิจารณาความเป็นไปได้ที่จะผ่านหลายรอบหรือไม่?
John Machin

ผลลัพธ์ต้องเป็นอะไร
O.rka

คำตอบ:


440

มันสามารถทำได้ด้วยรายการความเข้าใจ [function-of-item for item in some-list]เหล่านี้โดยทั่วไปจะใช้รูปแบบของ ตัวอย่างเช่นในการสร้างรายการใหม่โดยที่รายการทั้งหมดจะถูกลดขนาดลง (หรือเพิ่มขึ้นในตัวอย่างที่สอง) คุณจะใช้:

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

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

คุณยังสามารถใช้mapฟังก์ชัน:

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

12
ฟังก์ชั่นแผนที่ทำงานได้ตามที่คาดไว้ใน python2 อย่างไรก็ตามใน python3 คุณสามารถตัดแผนที่ในรายการเช่น:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S

39
ข้อเสนอที่สองที่มีแผนที่ถูกต้อง แต่สิ้นเปลือง มีจุดในการทำให้ฟังก์ชั่นแลมบ์ดาไม่มี เพียงใช้map(str.lower, ["A","B","C"])
fralau

1
เมื่อฉันพยายามพิมพ์รายการหลังจากการโทรนี้ไม่มีอะไรเปลี่ยนแปลง ทำไมถึงเป็นอย่างนั้น?
เลียนแบบ

1
@ เลียนแบบช้าไปหน่อย แต่สำหรับคนที่เจอสิ่งนี้ฉันเดาว่าปัญหาของคุณอาจเป็นไปได้ว่าคุณไม่ได้กำหนดผลลัพธ์ของรายการความเข้าใจกลับไปที่รายการของคุณ เพียงแค่ทำกับ list comprehension จะคืนค่า แต่ไม่ได้กำหนดค่าใหม่ให้กับตัวแปร list
Michael Kolber

52

นอกจากการอ่านได้ง่ายขึ้น (สำหรับหลาย ๆ คน) ความเข้าใจในรายการยังเป็นสิ่งที่ชนะการแข่งขันความเร็วเช่นกัน:

$ 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
คุณรู้หรือไม่ว่าทำไมความเข้าใจในรายการจึงเร็วกว่าแผนที่?
Nixuz

6
มันไม่ได้เร็วขึ้นเสมอไป นี่คือตัวอย่างที่ไม่ได้แสดง: stackoverflow.com/questions/1247486/... แต่ก็ไม่มากช้าลงในกรณีที่ว่า การใช้แลมบ์ดาเห็นได้ชัดว่าสร้างความแตกต่างอย่างมาก มีตัวอย่างเพิ่มเติมว่าทำไมการวางใจในสัญชาตญาณของคุณเกี่ยวกับปัญหาด้านประสิทธิภาพโดยเฉพาะอย่างยิ่งใน Python
เน็ด Deily

3
ใน python 3 mapชนะการแข่งขัน แต่ไม่ทำอะไรเลย :)
Jean-François Fabre

@NedDeily map(str.lower,["A","B","C"])เป็นที่เร็วที่สุดคือ python3.7.5
Shivam JINDAL


20

รายการความเข้าใจคือวิธีที่ฉันทำมันเป็นวิธี "Pythonic" การถอดเสียงต่อไปนี้แสดงวิธีการแปลงรายการเป็นตัวพิมพ์ใหญ่ทั้งหมดจากนั้นกลับไปสู่ระดับล่าง:

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
เอ่อ, การใช้listเป็นชื่อตัวแปรไม่ใช่ตัวเลือกที่ดีที่สุด :)
Jean-François Fabre

ไม่ แต่เนื่องจากชื่อมีความสำคัญเพียงเล็กน้อยต่อวิธีการแสดงจึงไม่เกี่ยวข้องจริงๆ อย่างไรก็ตามฉันจะเปลี่ยนชื่อในกรณีที่มีคนต้องการใช้รหัสตามที่เป็นอยู่
paxdiablo

ความมหัศจรรย์ของ stackoverflow: 250 votes สำหรับโซลูชัน python 2 เท่านั้นโดยใช้แลมบ์ดาซึ่งไม่ควร !! ตอนนี้ 249 ดี
Jean-François Fabre

@ Jean-FrançoisFabreไม่แน่ใจว่าทำไมคุณคิดว่านี่เป็นโซลูชั่น Python-2 เท่านั้น ดังที่การถอดเสียงแสดงอย่างชัดเจนว่าทำงานภายใต้ Python 3.5.2 อันที่จริงฉันเพิ่งตรวจสอบอีกครั้งเพื่อยืนยัน ... บางเวลาผ่านไปในขณะที่ผมตรวจสอบ ... ที่จริงไม่เคยคิดจะปรากฏให้คุณได้พูดคุยเกี่ยวกับคำตอบที่ได้รับการยอมรับในปัจจุบันมากกว่านี้ดังนั้นคุณควรอาจจะแสดงความคิดเห็นที่มีมากกว่าที่นี่ ไม่ต้องสงสัยเลยว่าเป็นความผิดพลาดที่ซื่อสัตย์ ไชโย
paxdiablo

1
ใช่ฉันไม่ได้วิจารณ์คุณ (นอกเหนือจากlistเนื้อหา :)) คุณคิดว่ารังสียูวีที่คุณเพิ่งได้รับมาจากไหน? :)
Jean-François Fabre

7

สำหรับตัวอย่างนี้ความเข้าใจนั้นเร็วที่สุด

$ python -m timeit -s 's = ["หนึ่ง", "สอง", "สาม"] * 1000' '[x.upper สำหรับ x in s]'
1,000 ลูปดีที่สุดคือ 3: 809 usec ต่อลูป

$ python -m timeit -s 's = ["หนึ่ง", "สอง", "สาม"] * 1,000' 'แผนที่ (str.upper, s)'
1000 ลูป, ดีที่สุดคือ 3: 1.12 msec ต่อลูป

$ python -m timeit -s 's = ["หนึ่ง", "สอง", "สาม"] * 1,000' 'แผนที่ (แลมบ์ดา x: x.upper (), s)'
1000 ลูป, ดีที่สุดคือ 3: 1.77 msec ต่อลูป

5

นักเรียนคนหนึ่งถามนักเรียนคนอื่นที่ตอบปัญหาเหมือนกัน :))

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

สารละลาย:

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

โซลูชันนี้จะสร้างรายการแยกต่างหากที่มีรายการตัวพิมพ์เล็กโดยไม่คำนึงถึงตัวพิมพ์ต้นฉบับ หากตัวพิมพ์ต้นฉบับเป็นตัวบนlist sจะมีตัวพิมพ์เล็กของรายการที่list pเกี่ยวข้อง หากกรณีดั้งเดิมของรายการมีตัวพิมพ์เล็กอยู่list pแล้วระบบlist sจะเก็บกรณีและรายการนั้นเป็นตัวพิมพ์เล็ก ตอนนี้คุณสามารถใช้แทนlist slist p


1

หากจุดประสงค์ของคุณคือการจับคู่กับสตริงอื่นโดยการแปลงในรอบเดียวคุณสามารถใช้str.casefold()เช่นกัน

สิ่งนี้มีประโยชน์เมื่อคุณมีตัวอักษรที่ไม่ใช่ ASCII และการจับคู่กับเวอร์ชัน ASCII (เช่น: maße vs masse) จะผ่านstr.lowerหรือstr.upperล้มเหลวในกรณีดังกล่าว str.casefold()นี้สามารถใช้ได้ในหลาม 3 และความคิดที่จะกล่าวถึงในรายละเอียดกับคำตอบ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

รุ่นที่ง่ายมากของคำตอบที่ด้านบนจะได้รับที่นี่โดย @Amorpheuses

ด้วยรายการค่าใน val:

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

สิ่งนี้ใช้ได้ดีสำหรับฉันด้วยแหล่งข้อความ f = open ()


1

คุณสามารถลองใช้:

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)

หากคุณต้องการสตริงหรือรายการเป็นเอาท์พุทไม่ใช่ตัววนซ้ำ (นี่ใช้สำหรับ Python3) ให้เปรียบเทียบ''.join(string).upper()ตัวเลือกกับสิ่งนี้:

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

หากคุณพยายามแปลงสตริงทั้งหมดเป็นตัวพิมพ์เล็กในรายการคุณสามารถใช้แพนด้า:

import pandas as pd

data = ['Study', 'Insights']

pd_d = list(pd.Series(data).str.lower())

เอาท์พุท:

['study', 'insights']
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.