格式化字符串,如轉換作者列表像格式化一個簡單的字符串/列表在Python
"David Joyner, Ashok Goel, Nic Papin"
到
"Joyner, D., Goel, A., Papin, N."
困惑在哪裏這個問題去。我知道這很簡單,只是使用方法,如.split()
和.strip()
,但無法弄清楚我需要什麼樣的組合。在我把頭轉到牆上之前,請幫忙。
格式化字符串,如轉換作者列表像格式化一個簡單的字符串/列表在Python
"David Joyner, Ashok Goel, Nic Papin"
到
"Joyner, D., Goel, A., Papin, N."
困惑在哪裏這個問題去。我知道這很簡單,只是使用方法,如.split()
和.strip()
,但無法弄清楚我需要什麼樣的組合。在我把頭轉到牆上之前,請幫忙。
這應該工作。
s = "David Joyner, Ashok Goel, Nic Papin"
s_list = s.split()
s_result = ""
for i,name in enumerate(s_list):
# Even number elements are first names and should be turned into single letters.
if i % 2 == 0:
inital = name[0]
else:
# Since we only split on spaces, in the odd case, name has a comma already appended.
s_result += name + " " + inital + "., "
# [:-2] removes both the trailing space and the comma.
print(s_result[:-2])
# Joyner, D., Goel, A., Papin N.
稍微簡單的版本是:
s = "David Joyner, Ashok Goel, Nic Papin"
names = s.split(",")
result = ""
for name in names:
first, last = name.split()
result += last + ', ' + first[0] + '., '
print(result[:-2])
但涉及額外的split
操作,如果你有名字的一個龐大的數字(否則這將是一個微不足道的變化),這將使它更慢。
做具體的姓氏爲東西:
所以,如果你想要做特定的一個列表的最後一個元素的東西,你可以做兩種方式:
最Python的將是使用enumerate
像在第一個例子,並捕獲情況下index == len(list) - 1
(最後一個元素):
s = "David Joyner, Ashok Goel, Nic Papin"
names = s.split(",")
result = ""
for index, name in enumerate(names):
first, last = name.split()
# Checks if index is lower than last.
if index < (len(names) - 1):
result += last + ', ' + first[0] + '., '
else:
result += '& ' + last + ", " + first[0] + '.'
print(result)
但是,如果你是堅決反對使用enumerate
,那麼你可以通過列表迭代只第二到最後一個元素,並在循環外進行最後的操作獲得相同的行爲:
s = "David Joyner, Ashok Goel, Nic Papin"
names = s.split(",")
result = ""
for name in names[:-1]:
first, last = name.split()
result += last + ', ' + first[0] + '., '
# Final element operation.
first, last = names[-1].split()
result += '& ' + last + ", " + first[0] + '.'
print(result)
真的,你應該只使用enumerate
,這是它的預期用途案件。無論您選擇哪種算法,您都會注意到我們打印result
而不是result[:-2]
。這是因爲我們不再像以前那樣將不必要的字符添加到姓氏中。
這個工程,但你可以解釋如何做到這一點,而不是第四行如此複雜?我們還沒有學到任何關於枚舉或如何一次搜索兩個術語的內容。 –
我添加了一個更簡單的版本,但[枚舉](https://docs.python.org/3/library/functions.html#enumerate)是一個簡單的內置函數,它允許您迭代列表中的元素和它的索引。 – Darkstarone
如果字符串被改爲「David Joyner,Ashok Goel和Nic Papin」並且期望的結果是「Joyner,D.,Goel,A.,&Papin,N. ,無論字符串或列表的長度如何 –
嗨,約翰,僅供將來參考:答案部分不用於更新你的進度最初的問題,你應該用新的信息編輯你的原始問題,另外,不要發佈代碼圖像,將它們發佈在代碼塊中(錯誤在一個單獨的代碼塊中),以便試圖幫助你的人可以輕鬆地複製和粘貼你的代碼。:) – Darkstarone
退房list comprehensions,str.join和str.format。如果你使用python,你會發現它們都很有幫助。
s = "David Joyner, Ashok Goel, Nic Papin"
fl_names = [name.split() for name in s.split(",")]
formatted_names = ["{0}, {1}.".format(last, first[0]) for first, last in fl_names]
result = ", ".join(formatted_names)
您也可以一起堵塞一切嵌套列表理解,但你可以看到這可能會更加困難,快速閱讀。
", ".join(["{0}, {1}.".format(last, first[0])
for first, last in [name.split() for name in s.split(",")]])
記住張貼到目前爲止您嘗試過? – abccd
如果您爲此顯示了代碼並指示代碼的哪一部分未按預期工作,將會有所幫助。最終,你想迭代列表,並在每次迭代中進行轉換。 – idjaw
申請分裂兩次一次','然後在''之後,只是安排你的價值... – Aditya