ฉันมีตัวแปรรายการหลามที่มีสตริง มีฟังก์ชันไพ ธ อนที่สามารถแปลงสตริงทั้งหมดในหนึ่งรอบเป็นตัวพิมพ์เล็กและในทางกลับกันเป็นตัวพิมพ์ใหญ่หรือไม่?
ฉันมีตัวแปรรายการหลามที่มีสตริง มีฟังก์ชันไพ ธ อนที่สามารถแปลงสตริงทั้งหมดในหนึ่งรอบเป็นตัวพิมพ์เล็กและในทางกลับกันเป็นตัวพิมพ์ใหญ่หรือไม่?
คำตอบ:
มันสามารถทำได้ด้วยรายการความเข้าใจ [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']
list(map(lambda x:x.upper(),["a","b","c"]))
map(str.lower, ["A","B","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
ชนะการแข่งขัน แต่ไม่ทำอะไรเลย :)
map(str.lower,["A","B","C"])
เป็นที่เร็วที่สุดคือ python3.7.5
>>> map(str.lower,["A","B","C"])
['a', 'b', 'c']
str.upper
จะแปลงเป็นตัวพิมพ์ใหญ่
รายการความเข้าใจคือวิธีที่ฉันทำมันเป็นวิธี "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']
list
เป็นชื่อตัวแปรไม่ใช่ตัวเลือกที่ดีที่สุด :)
list
เนื้อหา :)) คุณคิดว่ารังสียูวีที่คุณเพิ่งได้รับมาจากไหน? :)
สำหรับตัวอย่างนี้ความเข้าใจนั้นเร็วที่สุด
$ 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 ต่อลูป
นักเรียนคนหนึ่งถามนักเรียนคนอื่นที่ตอบปัญหาเหมือนกัน :))
fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
newList = []
for fruit in fruits:
newList.append(fruit.upper())
print(newList)
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)))
สารละลาย:
>>> 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 s
list p
หากจุดประสงค์ของคุณคือการจับคู่กับสตริงอื่นโดยการแปลงในรอบเดียวคุณสามารถใช้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
รุ่นที่ง่ายมากของคำตอบที่ด้านบนจะได้รับที่นี่โดย @Amorpheuses
ด้วยรายการค่าใน val:
valsLower = [item.lower() for item in vals]
สิ่งนี้ใช้ได้ดีสำหรับฉันด้วยแหล่งข้อความ f = open ()
คุณสามารถลองใช้:
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)
หากคุณต้องการสตริงหรือรายการเป็นเอาท์พุทไม่ใช่ตัววนซ้ำ (นี่ใช้สำหรับ 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)
หากคุณพยายามแปลงสตริงทั้งหมดเป็นตัวพิมพ์เล็กในรายการคุณสามารถใช้แพนด้า:
import pandas as pd
data = ['Study', 'Insights']
pd_d = list(pd.Series(data).str.lower())
เอาท์พุท:
['study', 'insights']