2017-04-17 23 views
-4
spam = ['apples', 'bananas', 'tofu', 'cats'] 

def stringmaker(data): 
    tempdata = 0 
    datastring = '' 
    stringlist = [] 
    stringdata = '' 
    stringdata += ', '.join(data) 
    stringlist += stringdata.split() 
    tempdata = stringlist 
    tempdata = str(stringlist.insert(-1, 'and')) 
    datastring += ' '.join(stringlist) 
    print(datastring) 


stringmaker(spam) 

在自動化與Python第102頁,實踐項目逗號碼無聊的東西 - 逗號碼自動化無聊的東西逗號碼

假設你有一個列表值是這樣的:垃圾= [「蘋果」 ,'bananas', 'tofu','cats']編寫一個函數,它將一個列表值作爲參數 並返回一個字符串,其中包含所有由逗號分隔的所有項目和一個空格,並在最後一項之前插入並插入。例如, 將以前的垃圾郵件列表傳遞給該函數將返回'蘋果, 香蕉,豆腐和貓'。但是你的函數應該能夠使用傳遞給它的任何列表值來工作 。

我寫的作品的代碼保留在本章的上下文中。我已經看過在這個網站和谷歌的其他答案,我驚訝於我的代碼是多麼不同也許愚蠢。有人能幫我指出我的代碼的所有壞事嗎?

我真的很喜歡這樣pyyonic和儘可能少的幾行。

+4

如果這是**工作代碼**,你認爲可以改進,參見[codereview.se。但請注意,*「pythonic和幾行」*有時可能會發生衝突。 – jonrsharpe

+0

'data [0] if len(data)== 1 else',and'.join([','.join(data [: - 1]),data [-1]])'我會怎麼做它 –

回答

0
def stringmaker(data): 
    return ", ".join(data[:-1]) + " and " + data[-1] 

它所做的:加入列表中,但最後一個元素「」,然後添加‘和’最後一個元素

正如你的問題說的評論,有時更好,所以放棄'單行',以使您的代碼更具可讀性。

也請注意,現在如果數據是一個空列表這個代碼不起作用

+2

我想刪除你的第一個例子,考慮到第二個更短,更可讀。另外,你的函數沒有'return'語句。 – Blender

+1

什麼是「桌子」?你的意思是'數據'嗎? –

+0

如果您想遵循規範,我遵循了您的兩個建議 – WNG

0

您可以使用類似:

words = ['apples', 'bananas', 'tofu', 'cats'] 
def spam(words): 
    if words: # prevents parsing an empty list 
     return ", ".join(words[:-1]) + ", and " + words[-1] 
print spam(words) 
# apples, bananas, tofu, and cats 

Demo


注意: 英文中,您通常不會使用commasand

+0

我不同意「你通常不會使用」一個[連續的逗號](https://en.wikipedia.org/wiki/Serial_comma) – TemporalWolf

+1

這方面有一些爭議,例如,美聯社不使用逗號在協調連詞之前。無論如何...感謝您指出這一點!我的母語是葡萄牙語,我們在*** ***(和)之前不使用*** virgulas ***(逗號);) –

1

它會做你的工作:

spam = ['apples', 'bananas', 'tofu', 'cats',] 
def commacode(spam): 
    return print(', '.join(spam[:-1]) + ' and ' + spam[-1]) 

commacode(spam)