วิธีการใช้อักษรตัวแรกของแต่ละคำในสตริงให้เป็นตัวพิมพ์ใหญ่?


588
s = 'the brown fox'

... ทำอะไรที่นี่ ...

s ควรจะเป็น :

'The Brown Fox'

วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร?

คำตอบ:


989

.title()วิธีการของสตริง (ทั้ง ASCII หรือ Unicode เป็นดี) ไม่นี้:

>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'

อย่างไรก็ตามให้ระวังสตริงที่มีเครื่องหมายอัญประกาศเดี่ยวฝังอยู่ดังที่ระบุไว้ในเอกสาร

อัลกอริทึมใช้คำนิยามที่ไม่ขึ้นกับภาษาอย่างง่ายของคำว่าเป็นกลุ่มของตัวอักษรที่ต่อเนื่องกัน คำนิยามใช้งานได้ในหลายบริบท แต่ก็หมายความว่าอะพอสโทรฟีในการหดตัวและการครอบครองครอบครองเป็นขอบเขตของคำซึ่งอาจไม่เป็นผลลัพธ์ที่ต้องการ:

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

56
ฉันหลีกเลี่ยงปัญหาการครอบครองกับสิ่งที่ชอบ" ".join(w.capitalize() for w in s.split())
mehtunguh

3
สิ่งนี้ไม่ปลอดภัยสำหรับสตริงส่วนใหญ่เพราะทุกคำแม้เป็นเจ้าของก็จะได้รับตัวพิมพ์ใหญ่

10
มีปัญหากับ string.title () เมื่อคุณใช้ตัวอย่างเช่นผลที่ต้องการจะเป็น"e g 3b" "E G 3b"อย่างไรก็ตามผลตอบแทน"e g 3b".title() "E G 3B"
Sören

7
โปรดทราบว่าสิ่งนี้จะทำให้เกิดปัญหาเช่นกัน:In [2]: 'tEst'.title() Out[2]: 'Test'
Jonas Libbrecht

4
คำตอบที่ยอดเยี่ยมและความเห็นที่เน้นว่าในงูใหญ่ไม่ใช่ทุกอย่างที่ทำงานตามที่คุณต้องการ แต่มีวิธีที่สะดวกในการทำเช่นนั้นเสมอ วิธีที่สะดวกที่สุดมักจะนำเข้าไลบรารีที่สร้างขึ้นด้วยวัตถุประสงค์เช่นpython-titlecase
Aaron3468

189

.title()วิธีการไม่สามารถทำงานได้ดี

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

ลองstring.capwords()วิธี

import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"

จากpython docs ใน capwords :

แยกอาร์กิวเมนต์ออกเป็นคำโดยใช้ str.split () ใช้ตัวพิมพ์ใหญ่แต่ละคำโดยใช้ str.capitalize () และเข้าร่วมคำที่เป็นตัวพิมพ์ใหญ่โดยใช้ str.join () หากอาร์กิวเมนต์ที่สองทางเลือก sep ขาดหรือไม่มีการเรียกใช้อักขระช่องว่างจะถูกแทนที่ด้วยช่องว่างเดียวและช่องว่างนำหน้าและต่อท้ายจะถูกลบออกมิฉะนั้น sep จะใช้เพื่อแยกและเข้าร่วมคำ


2
Capwords "There once was a string with an 'that had words right after it and then closed'"ยังขาดและไม่ได้จัดการกับบางสิ่งบางอย่างเช่น ด้วยตัวอย่างนี้ทุกภพยกเว้นthatจะได้รับทุนตามที่คาดไว้ ผลลัพธ์ที่ได้คือ"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
devonbleibtrey

ยังใช้งานได้ดีกว่าtitle()สำหรับสถานการณ์ปกติ ในสถานการณ์ของฉันtitle()ส่งคืนเอาต์พุตที่ไม่ถูกต้องสำหรับชื่อที่มีเครื่องหมายเน้นเสียงหรือการกำหนดค่าในขณะcapwords()จัดการอย่างถูกต้อง
houcros

1
ดี แต่ก็ยังทำให้ความแตกต่างของ "Uk / UK"
Jonath P

@Chen Houwu, Uk / UK เป็นตัวอย่างเคาน์เตอร์ที่สมบูรณ์แบบ จะป้องกัน Python จากการลดอักษรตัวใหญ่ที่มีอยู่โดยใช้วิธีการที่คล้ายกันได้อย่างไร
h0r53

104

เพียงเพราะสิ่งแบบนี้สนุกสำหรับฉันนี่คือคำตอบอีกสองข้อ

แบ่งออกเป็นคำเริ่มต้นขีดแต่ละคำจากกลุ่มแยกและเข้าร่วมอีกครั้ง สิ่งนี้จะเปลี่ยนพื้นที่สีขาวโดยแยกคำเป็นพื้นที่สีขาวเดียวไม่ว่าจะเป็นอะไร

s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)

แก้ไข: ฉันจำไม่ได้ว่าฉันคิดถึงอะไรเมื่อฉันเขียนโค้ดด้านบน แต่ไม่จำเป็นต้องสร้างรายการที่ชัดเจน เราสามารถใช้นิพจน์ตัวสร้างเพื่อทำในลักษณะขี้เกียจ ดังนั้นนี่คือทางออกที่ดีกว่า:

s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())

ใช้นิพจน์ทั่วไปเพื่อจับคู่จุดเริ่มต้นของสตริงหรือการเว้นวรรคคำสีขาวรวมทั้งอักขระที่ไม่ใช่ช่องว่างเดี่ยว ใช้วงเล็บเพื่อทำเครื่องหมาย "กลุ่มการจับคู่" เขียนฟังก์ชั่นที่จะจับคู่วัตถุและส่งคืนกลุ่มการจับคู่ white space และกลุ่มการจับคู่อักขระที่ไม่ใช่ whitespace ในกรณีส่วนบน จากนั้นใช้re.sub()เพื่อแทนที่รูปแบบ อันนี้ไม่มีปัญหาเครื่องหมายวรรคตอนของวิธีแก้ปัญหาแรกและไม่ทำซ้ำพื้นที่สีขาวเหมือนวิธีแก้ปัญหาแรกของฉัน อันนี้ให้ผลลัพธ์ที่ดีที่สุด

import re
s = 'the brown fox'

def repl_func(m):
    """process regular expression match groups for word upper-casing problem"""
    return m.group(1) + m.group(2).upper()

s = re.sub("(^|\s)(\S)", repl_func, s)


>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"

ฉันดีใจที่ฉันค้นคว้าคำตอบนี้ ฉันไม่รู้ว่าre.sub()จะใช้ฟังก์ชั่นได้! คุณสามารถทำการประมวลผลแบบไร้สาระภายในre.sub()เพื่อสร้างผลลัพธ์สุดท้าย!


1
+1 สำหรับการแก้ปัญหาโดยใช้ชิ้น ฉันต้องการบางสิ่งที่จะใช้ประโยชน์จากตัวอักษรตัวแรกโดยไม่ต้องเปลี่ยนการใช้อักษรตัวใหญ่ของคำอื่น ๆ (เช่น Foo กลายเป็น foo แต่ FOO กลายเป็น fOO) มันสมบูรณ์แบบ
TomNysetvold

1
capitalize ส่งคืนอักขระตัวแรกที่เป็นตัวพิมพ์ใหญ่และส่วนที่เหลือจะลดลง
Vanuan

@Vanuan คุณพูดถูก! คำอธิบายสตริงเอกสารทำให้ฉันคิดว่ามันทำทั้งหมดเป็นตัวพิมพ์ใหญ่ตัวแรก แต่คุณมีความถูกต้องเกี่ยวกับสิ่งที่มันทำจริง ฉันจะแก้ไขคำตอบ ขอบคุณสำหรับหัวขึ้น
steveha

สิ่งนี้ดูเหมือนจะเป็นสิ่งที่string.capwordsทำตามเอกสารในคำตอบของ Chen Houwu
Adrian Keister

1
สิ่งที่ควรสังเกตในคำตอบข้างต้นแทนที่จะใช้ s.split () ฉันคิดว่าควรใช้ s.split ('') ดีกว่า เนื่องจากในกรณีที่สตริงมีช่องว่างสองเท่าและคุณต้องการรักษาช่องว่างคู่เหล่านั้นไว้ในการเข้าร่วม s.plit ('') จะช่วยให้คุณรักษาช่องว่างในขณะที่ s.split () จะไม่
manpikin

21

ต่อไปนี้เป็นบทสรุปของวิธีการที่แตกต่างกันในการดำเนินการพวกเขาจะทำงานได้กับอินพุตเหล่านี้ทั้งหมด:

""           => ""       
"a b c"      => "A B C"             
"foO baR"    => "FoO BaR"      
"foo    bar" => "Foo    Bar"   
"foo's bar"  => "Foo's Bar"    
"foo's1bar"  => "Foo's1bar"    
"foo 1bar"   => "Foo 1bar"     

- ทางออกที่ง่ายที่สุดคือการแบ่งประโยคเป็นคำและใช้ตัวอักษรตัวแรกจากนั้นรวมเข้าด้วยกัน:

# Be careful with multiple spaces, and empty strings
# for empty words w[0] would cause an index error, 
# but with w[:1] we get an empty string as desired
def cap_sentence(s):
  return ' '.join(w[:1].upper() + w[1:] for w in s.split(' ')) 

- หากคุณไม่ต้องการแยกสตริงอินพุตให้เป็นคำก่อนและใช้ตัวสร้างแฟนซี:

# Iterate through each of the characters in the string and capitalize 
# the first char and any char after a blank space
from itertools import chain 
def cap_sentence(s):
  return ''.join( (c.upper() if prev == ' ' else c) for c, prev in zip(s, chain(' ', s)) )

- หรือไม่มีการนำเข้าเครื่องมือจัดการ:

def cap_sentence(s):
  return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) )

- หรือคุณสามารถใช้การแสดงออกปกติจากคำตอบของ steveha :

# match the beginning of the string or a space, followed by a non-space
import re
def cap_sentence(s):
  return re.sub("(^|\s)(\S)", lambda m: m.group(1) + m.group(2).upper(), s)

ต่อไปนี้เป็นคำตอบอื่น ๆที่โพสต์และอินพุตที่ใช้ไม่ได้ตามที่คาดไว้หากเราใช้คำจำกัดความของคำว่าเป็นจุดเริ่มต้นของประโยคหรืออะไรก็ตามหลังจากช่องว่าง:

  return s.title()

# Undesired outputs: 
"foO baR"    => "Foo Bar"       
"foo's bar"  => "Foo'S Bar" 
"foo's1bar"  => "Foo'S1Bar"     
"foo 1bar"   => "Foo 1Bar"      

  return ' '.join(w.capitalize() for w in s.split())    
  # or
  import string
  return string.capwords(s)

# Undesired outputs:
"foO baR"    => "Foo Bar"      
"foo    bar" => "Foo Bar"      

การใช้ '' สำหรับการแยกจะแก้ไขเอาต์พุตที่สอง แต่ capwords () ยังคงใช้งานไม่ได้ในครั้งแรก

  return ' '.join(w.capitalize() for w in s.split(' '))    
  # or
  import string
  return string.capwords(s, ' ')

# Undesired outputs:
"foO baR"    => "Foo Bar"      

ระวังช่องว่างหลาย ๆ ช่อง

  return ' '.join(w[0].upper() + w[1:] for w in s.split())
# Undesired outputs:
"foo    bar" => "Foo Bar"                 

+1 สำหรับการสรุปที่ครอบคลุม ฉันกำลังมองหาวิธีที่จะใช้อักษรตัวพิมพ์ใหญ่ต่อท้ายคำเท่านั้น (ไม่ใช่ทุกคำ) คุณสามารถเพิ่มคำตอบที่แสดงถึงสิ่งนี้ได้หรือไม่? เช่นlower 123 upperควรคืนค่าlower 123 Upperโดยให้upperเป็นตัวพิมพ์ใหญ่ตามหลังตัวเลข ฉันรู้ว่ามันเกินขอบเขตของคำถามของ OP แต่เป็นส่วนเสริมที่ดีสำหรับคำตอบที่กว้างขวางของคุณ ขอบคุณล่วงหน้า.
ProGrammer

คุณสามารถแก้ไขวิธีการข้างต้นบางอย่างเพื่อให้เหมาะกับความต้องการของคุณในกรณีนี้ อย่างไรก็ตามฉันจะไม่เพิ่มเป็นส่วนหนึ่งของคำตอบเนื่องจากไม่ใช่สิ่งที่คนส่วนใหญ่มองหา ฉันจะใช้รุ่น regex สำหรับมันและใช้"([0-9]+)(\s+.)"แทน"(^|\s)(\S)"(จับคู่หนึ่งหมายเลขหรือมากกว่าตามด้วยช่องว่างอย่างน้อยหนึ่งช่องและอักขระใด ๆ หลังจากนั้น) หรือ "([0-9]+)(\s*.)"ถ้าคุณต้องการใช้ประโยชน์จากตัวอักษรหลังจากช่องว่าง 'ศูนย์หรือมากกว่า' หลังจาก หมายเลข
aljgom

ฉันจะต้องแน่ใจว่าได้ตรวจสอบมันทำให้ฉันคิดเกี่ยวกับกรณีพิเศษอื่น: คุณจะปรับเปลี่ยนตัวอย่างด้านบนเพื่อรับสตริงเช่นWW1 - the great warและเอาท์พุทWW1 - The Great WarแทนWw1 ...ได้อย่างไร ดูปัญหาเกี่ยวกับตัวย่อหรือไม่ คุณยินดีที่จะเพิ่มสิ่งที่แสดงให้เห็นถึงกรณีนี้หรือไม่? ฉันสงสัยเกี่ยวกับเรื่องนี้มาระยะหนึ่งแล้วและไม่สามารถคิดวิธีที่จะทำได้
ProGrammer

วิธีแรกที่ระบุไว้ข้างต้นจะไม่เปลี่ยนแปลงตัวอักษรที่เป็นตัวพิมพ์ใหญ่ในสตริงอินพุตดังนั้นWW1จะแสดงผลลัพธ์เป็นWW1
aljgom

15

รุ่นคัดลอกวางวางของ @jibberia anwser:

def capitalize(line):
    return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))

2
ไม่จำเป็นต้องสร้างรายการ str.joinยอมรับเครื่องกำเนิดไฟฟ้า
warvariuc

@warvariuc คุณจะเปลี่ยนรหัสนี้อย่างไรเพื่อใช้ประโยชน์จากเครื่องกำเนิด?
Konstantin Spirin

1
เพียงลบเครื่องหมายวงเล็บออกแล้วเหมือนที่ทำที่นี่
warvariuc

1
แม้ว่า @warvariuc นั้นสมบูรณ์แบบในการกล่าวถึงที่joinยอมรับ exps ของ Gen ในกรณีของstr.joinโดยเฉพาะอย่างยิ่งมันเป็นที่ต้องการโดยทั่วไปที่จะใช้รายการความเข้าใจ นี่เป็นเพราะjoinวนซ้ำสองครั้งในการโต้แย้งและด้วยเหตุนี้จึงเร็วกว่าที่จะจัดเตรียมรายการที่พร้อมจะไปแทนที่จะเป็นเครื่องกำเนิด
Bhargav Rao

1
@BhargavRao ทำไมจะstr.joinต้องวนซ้ำสองครั้งในการโต้แย้ง? ฉันเพิ่งตรวจสอบ - มันไม่ได้ แม้ว่าความเข้าใจในรายการลำดับเล็ก ๆ จะเร็วขึ้นแน่นอน
warvariuc

12

ทำไมคุณถึงทำให้ชีวิตคุณยุ่งเหยิงด้วยการรวมตัวและวนซ้ำเมื่อการแก้ปัญหานั้นง่ายและปลอดภัย?

แค่ทำสิ่งนี้:

string = "the brown fox"
string[0].upper()+string[1:]

2
เพราะอาจมีหลายคำ
Arnaud

1
ใช่ แต่บ่อยครั้งที่ฉันต้องการใช้อักษรตัวแรกให้พิมพ์ใหญ่เท่านั้น นี่เป็นวิธีที่จะทำเช่นนั้น
Deleet

1
คุณจะไม่ใช้"the brown fox".capitalize()หรือไม่
luckydonald

2
@luckydonald เพราะบางทีฉันไม่ต้องการที่จะเปิดเข้าไป'this is John' 'This is john'
janek37

ไม่ใช่วิธีที่ดีกว่าในการทำสิ่งนี้ง่ายๆstring.capitalize()(โดยพื้นฐานแล้วสะท้อน @luckydonald)
Hassan Baig

10

หาก str.title () ไม่ได้ผลสำหรับคุณให้ใช้อักษรตัวพิมพ์ใหญ่ด้วยตัวเอง

  1. แยกสตริงออกเป็นรายการคำ
  2. ใช้อักษรตัวแรกของแต่ละคำให้เป็นตัวพิมพ์ใหญ่
  3. เข้าร่วมคำเป็นสตริงเดียว

หนึ่งในสายการบิน:

>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"

ตัวอย่างที่ชัดเจน:

input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
    title_case_word = word[0].upper() + word[1:]
    capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)

1
สิ่งหนึ่งที่น่าสนใจสำหรับโซลูชันนี้คือคุณเสียช่องว่างพิเศษ อาจไม่สำคัญขึ้นอยู่กับบริบท
mklauber

8

ถ้าคุณเพียงต้องการอักษรตัวแรก:

>>> 'hello world'.capitalize()
'Hello world'

แต่จะใช้ประโยชน์จากแต่ละคำ:

>>> 'hello world'.title()
'Hello World'

ระวังเพราะ'hello New York'.capitalize()is'Hello new york'
user2314737

5

สตริงว่างจะเพิ่มข้อผิดพลาดหากคุณเข้าถึง [1:] ดังนั้นฉันจะใช้:

def my_uppercase(title):
    if not title:
       return ''
    return title[0].upper() + title[1:]

เพื่อพิมพ์ใหญ่อักษรตัวแรกเท่านั้น


นั่นไม่ได้str.capitalizeมีไว้เพื่ออะไร
Eugene Pakhomov

4
@Eugene ใช่ แต่น่าเสียดายที่พิมพ์ตัวอักษรตัวเล็กทั้งหมดซึ่งอาจไม่เป็นที่ต้องการ : /
Wim Feijen

return title[:1].upper() + title[1:]ก็จะดูแลปัญหานั้นตั้งแต่การตัดสตริงว่างเช่นที่จะให้ 2 สตริงว่างร่วมกันทำสตริงว่างซึ่งจะถูกส่งกลับ
aljgom

3

ตามที่มาร์คชี้ให้เห็นคุณควรใช้.title():

"MyAwesomeString".title()

อย่างไรก็ตามหากต้องการสร้างตัวอักษรตัวใหญ่ตัวแรกในแม่แบบ djangoคุณสามารถใช้สิ่งนี้:

{{ "MyAwesomeString"|title }}

หรือใช้ตัวแปร:

{{ myvar|title }}

3

วิธีการที่แนะนำ str.title () ไม่สามารถใช้งานได้ในทุกกรณี ตัวอย่างเช่น:

string = "a b 3c"
string.title()
> "A B 3C"

"A B 3c"แทน

ฉันคิดว่ามันจะดีกว่าที่จะทำสิ่งนี้:

def capitalize_words(string):
    words = string.split(" ") # just change the split(" ") method
    return ' '.join([word.capitalize() for word in words])

capitalize_words(string)
>'A B 3c'

1
อย่างไรก็ตามข้อผิดพลาดอาจเกิดขึ้นหากจำนวนของช่องว่างแยกพวกเขาไม่ใช่ 1 สำหรับการอ้างอิง: ปัญหาแฮกเกอร์ธนาคาร
Divakar Rajesh

3

แม้ว่าคำตอบทั้งหมดจะได้รับความพึงพอใจอยู่แล้ว แต่ฉันจะพยายามครอบคลุม 2 กรณีเพิ่มเติมพร้อมกับคดีก่อนหน้าทั้งหมด

ถ้าช่องว่างไม่เหมือนกันและคุณต้องการคงไว้เหมือนเดิม

string = hello    world i  am    here.

ถ้าสตริงทั้งหมดไม่ได้เริ่มต้นจากตัวอักษร

string = 1 w 2 r 3g

ที่นี่คุณสามารถใช้สิ่งนี้

def solve(s):
    a = s.split(' ')
    for i in range(len(a)):
        a[i]= a[i].capitalize()
    return ' '.join(a)

สิ่งนี้จะทำให้คุณ

output = Hello    World I  Am    Here
output = 1 W 2 R 3g

ฉันหวังว่านี่จะไม่ซ้ำซ้อน


2
ขอบคุณสำหรับการเน้นสีของช่องว่างที่ไม่สม่ำเสมอ บางคำตอบข้างต้นใช้ s.split () แทน s.split ('') มันเป็นสิ่งสำคัญที่จะต้องทราบว่าสำหรับช่องว่างที่ไม่สม่ำเสมอการใช้ s.split ('') จะทำให้แน่ใจได้ว่าช่องว่างที่ไม่สม่ำเสมอนั้นได้รับการดูแล! ขอขอบคุณอีกครั้ง
manpikin

เหมาะสำหรับคำที่มีช่องว่างไม่สม่ำเสมอหรือคำที่ขึ้นต้นด้วยหลัก ขอบคุณ :)
Amresh Giri

2

เพื่อใช้ประโยชน์คำ ...

str = "this is string example....  wow!!!";
print "str.title() : ", str.title();

@ ความคิดเห็น Gary02127 ด้านล่างชื่องานแก้ปัญหาด้วย apostrophe

import re

def titlecase(s):
    return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", lambda mo: mo.group(0)[0].upper() + mo.group(0)[1:].lower(), s)

text = "He's an engineer, isn't he? SnippetBucket.com "
print(titlecase(text))

ใช้ฟังก์ชั่นที่มีอยู่ให้ดำเนินการอย่างรวดเร็วในหลาม
Tejas Tank

ฉันไม่ชอบชื่อ () เพราะมันไม่ได้จัดการกับเครื่องหมายอะโพสโทรฟี "ฉันไม่สามารถพูดได้" .title () ให้ "ฉันไม่สามารถพูดได้"
Gary02127

@ Gary02127 ฉันได้รับคำตอบแล้วโปรดดูใช้งานได้ดีกับโดเมนปัญหาของคุณด้วย
Tejas Tank

1

อย่ามองข้ามการอนุรักษ์พื้นที่สีขาว หากคุณต้องการประมวลผล'fred flinstone'และได้รับ'Fred Flinstone'แทนคุณ'Fred Flinstone'ได้ทำลายพื้นที่สีขาวของคุณ การแก้ปัญหาข้างต้นบางอย่างจะเสียพื้นที่สีขาว นี่คือวิธีแก้ปัญหาที่ดีสำหรับ Python 2 และ 3 และรักษาพื้นที่สีขาว

def propercase(s):
    return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))

0

ฟังก์ชั่นการทำงานอย่างรวดเร็วสำหรับ Python 3

Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> capitalizeFirtChar = lambda s: s[:1].upper() + s[1:]
>>> print(capitalizeFirtChar('помните своих Предковъ. Сражайся за Правду и Справедливость!'))
Помните своих Предковъ. Сражайся за Правду и Справедливость!
>>> print(capitalizeFirtChar('хай живе вільна Україна! Хай живе Любовь поміж нас.'))
Хай живе вільна Україна! Хай живе Любовь поміж нас.
>>> print(capitalizeFirtChar('faith and Labour make Dreams come true.'))
Faith and Labour make Dreams come true.

0

ใช้ประโยชน์สตริงด้วยช่องว่างที่ไม่สม่ำเสมอ

ฉันเข้าใจว่านี่เป็นคำถามเก่าและอาจเป็นคำตอบที่เกือบจะ exhausited แต่ฉันต้องการเพิ่มในจุดของ @Amit Gupta ของช่องว่างที่ไม่สม่ำเสมอ s = 'the brown fox'จากคำถามเดิมเราต้องการที่จะลงทุนทุกคำในสตริง เกิดอะไรขึ้นถ้าสตริงนั้นs = 'the brown fox'มีช่องว่างที่ไม่สม่ำเสมอ

def solve(s):
    # if you want to maintain the spaces in the string, s = 'the brown      fox'
    # use s.split(' ') instead of s.split(). 
    # s.split() returns ['the', 'brown', 'fox']
    # while s.split(' ') returns ['the', 'brown', '', '', '', '', '', 'fox']
    capitalized_word_list = [word.capitalize() for word in s.split(' ')]
    return ' '.join(capitalized_word_list)

.. รหัสของคุณไม่สามารถชดเชยแท็บได้หากไม่ใช่ช่องว่างระหว่างสีน้ำตาลและฟ็อกซ์ ;-)
ZF007

-1

** ในกรณีที่คุณต้องการลดขนาด **

 #Assuming you are opening a new file   
 with open(input_file) as file:
     lines = [x for x in reader(file) if x]
 #for loop to parse the file by line
 for line in lines:
           name = [x.strip().lower() for x in line if x]
           print(name) #check the result

-2

ฉันชอบคำตอบนี้จริงๆ:

รุ่นคัดลอกวางวางของ @jibberia anwser:

def capitalize(line):
    return ' '.join([s[0].upper() + s[1:] for s in line.split(' ')])

แต่บางส่วนของบรรทัดที่ฉันส่งแยกออกอักขระบางตัวที่ว่างเปล่าซึ่งทำให้เกิดข้อผิดพลาดเมื่อพยายามทำ [1:] อาจเป็นวิธีที่ดีกว่าในการทำเช่นนี้ แต่ฉันต้องเพิ่มในถ้า len (s)> 0 เช่นเดียวกับใน

return ' '.join([s[0].upper() + s[1:] for s in line.split(' ') if len(s)>0])

2
มันซับซ้อนเกินไปคุณคิดจะตรวจสอบความยาวหรือไม่! ไม่มีประสิทธิภาพ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.