2017-04-20 32 views
-1

格式化字符串,如轉換作者列表像格式化一個簡單的字符串/列表在Python

"David Joyner, Ashok Goel, Nic Papin" 

"Joyner, D., Goel, A., Papin, N." 

困惑在哪裏這個問題去。我知道這很簡單,只是使用方法,如.split().strip(),但無法弄清楚我需要什麼樣的組合。在我把頭轉到牆上之前,請幫忙。

+1

記住張貼到目前爲止您嘗試過? – abccd

+0

如果您爲此顯示了代碼並指示代碼的哪一部分未按預期工作,將會有所幫助。最終,你想迭代列表,並在每次迭代中進行轉換。 – idjaw

+1

申請分裂兩次一次','然後在''之後,只是安排你的價值... – Aditya

回答

2

這應該工作。

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]。這是因爲我們不再像以前那樣將不必要的字符添加到姓氏中。

+0

這個工程,但你可以解釋如何做到這一點,而不是第四行如此複雜?我們還沒有學到任何關於枚舉或如何一次搜索兩個術語的內容。 –

+0

我添加了一個更簡單的版本,但[枚舉](https://docs.python.org/3/library/functions.html#enumerate)是一個簡單的內置函數,它允許您迭代列表中的元素和它的索引。 – Darkstarone

+0

如果字符串被改爲「David Joyner,Ashok Goel和Nic Papin」並且期望的結果是「Joyner,D.,Goel,A.,&Papin,N. ,無論字符串或列表的長度如何 –

0
+0

嗨,約翰,僅供將來參考:答案部分不用於更新你的進度最初的問題,你應該用新的信息編輯你的原始問題,另外,不要發佈代碼圖像,將它們發佈在代碼塊中(錯誤在一個單獨的代碼塊中),以便試圖幫助你的人可以輕鬆地複製和粘貼你的代碼。:) – Darkstarone

0

退房list comprehensionsstr.joinstr.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(",")]])