2012-05-23 40 views
4

我不得不創建一個類似於此代碼幾次:或許添加額外的句子/單詞串

if condition(): 
    word = " not" 
else: 
    word = "" 

print "A five ounce bird could{0} carry a one pound coconut".format(word) 

我已經剝離下來的問題,它的骨頭在這裏,在「實踐」有希望是"A","five","bird","a","one","coconut"的額外變量,以便它們都可以改變,並且隨着它們一起添加了多個s-es和什麼。

它總是令我感到滿意。在"not"之前需要的額外空間以及{0}之前缺少空格都是irk,但是因爲如果word爲空,我不想要兩個空格,所以我看不到任何其他方式來執行此操作。

創建兩個單獨的消息與DRY打破,有時甚至因爲可能的組合數量而不可行。

有沒有更好的方法來做到這一點?

+1

它可以抓住它的外殼... –

+0

如果你想要國際化你的程序,創建兩個單獨的消息是正確的方法。國際化也將有助於複數。你應該檢查'gettext'等。 –

回答

3

創建一個單詞列表,如果需要插入,然後' '.join(words)他們。

如果有逗號/週期,建立一個句子結構:

[['If', 'there', 'are', 'periods'], ', ', ['build', 'a', 'sentence', 'structure'], '.'] 

與所述標點符號相應的空間(逗號後空間,括號前的空間,...),然後' '.join()字組內和''.join()的個別團體。 (感謝@Alfe提供的加入詞和組的建議不同)。

+2

我建議通過''''而不是'''連接部分,並將需要的空格放入字符串常量中(例如'','')。這樣你也可以處理開括號(在字符之前需要空格*)等。 – Alfe

+1

而不是表示'['如果','有','是','句號']'我打算寫''如果有句號'.split()'。 – Alfe

2

創建幹

兩個獨立的消息斷裂如果你關心i18n,然後創建了兩個單獨的消息可能是唯一合理的方式做到這一點。

+0

我剛剛對此發表評論,所以我會給你+1 –

1

對於" not"情況下,保持它的簡單:

print "A five ounce bird could{0} carry a one pound coconut".format(" not" if condition() else "") 
+1

這並不真正回答_question_,這與''not「'中的空間有關。 –

1

我會做...

word = ("could" if not condition() else "could not") 

print "A five ounce bird {0} carry a one pound coconut".format(word) 

:P

編輯:對於一般情況下,這是什麼你想,我會按構圖去。例如。 (好吧,這太GO4和簡單化,我喜歡,但使點):

class Agglutinator(list): 
    def __str__(self): 
     return self._separator.join(str(x) for x in self) 


class Paragraph(Agglutinator): 
    """Returns dot separated sentences""" 
    _separator = '. ' 

class Sentence(Agglutinator): 
    """Returns comma separated clauses""" 
    _separator = ', ' 

class Clause(Agglutinator): 
    """Returns space separated words""" 
    _separator = ' ' 

c1 = Clause(["A", "number", "of", "words", "make", "a", "clause"]) 
c2 = Clause(["and", "a", "number", "of", "clauses", "make", "a", "sentence"]) 
c3 = Clause(["A", "collection", "of", "sentences", "makes", "a", "paragraph"]) 

s1 = Sentence([c1, c2]) 
s2 = Sentence([c3]) 

print Paragraph([s1, s2]) 

它給你:

A number of words make a clause, and a number of clauses make a sentence. A collection of sentences makes a paragraph 

在闡述這一點,你可以做Sentence大寫第單詞等。

+0

這隻適用於您的特定情況,但我的觀點是您不應將「不」作爲「可能」的單獨粒子處理。這讓生活更輕鬆。 –

+0

避免這個問題的好方法。 :)但是,它並沒有解決_generic_問題,但這並不總是可行或實際的。 –

+0

關於你對@eumiro的問題(「如果插入的單詞應該在一段時間之前就會發生什麼?」)我會一次構造一個句子,然後加入它們,例如。 「。」。加入(句子)。類似的過程逗號等 –

1

由於空格必須是和哪裏不是用英語(以及我知道的其他語言)清楚的規則,您可以使用所有句子部分的簡單列表(例如['If', 'there', 'are', 'commas', ',', 'we', 'insert', 'them', '.']),然後編寫一個應用Engl的專業連接功能ish規定了必須插入空格的位置(例如, G。在詞之間,逗號之後,在開括號之前......)。

+0

我喜歡這個想法,我認爲它至少可以選擇eumiro的建議。儘管分別引用每個詞的需要使得所有這些變體的吸引力減少,我想。 –

+0

是的,我再次建議使用''一個兩個三'.split()'或一個專門的'sentenceSplit('一個兩個三,四個五六')'這適用於標點符號以及單詞邊界。你還應該考慮像'--'這樣的標點符號,諸如'''','',' - ,'等詞組標點符號,如'不'和其他東西像連字符。 – Alfe

+0

是的,自然語言充滿了nashisms>; - ] – Alfe

1

另一種方式來處理這個問題,但我不知道這是否是你在找什麼

word = "not" 

print "A five ounce bird could{0} carry a one pound coconut".format(" "+word if condition() else "") 

好了,多了一個途徑。但事實上,幾乎所有的人都是相似或相同......

def format_word(word): 
    if word: 
     return " " + word 
    else: 
     return "" 

print "A five ounce bird could{0} carry a one pound coconut".format(format_word(word)) 

但或許,所有的看起來irking,因爲它們實際上是類似...

最終方法可能是:

if condition(): 
    word = "not" 
else: 
    word = "" 

wrd = "A five ounce bird could {0} carry a one pound coconut".format(word) 
print wrd.replace(" ", " ") # replace all double spaces with singular one... 

,但肯定的,它是骯髒的太...

+0

這使得irking空間更加突出,這是一個優勢嗎? – Alfe

+0

Python有很多種方法可以做到這一點,但是在你的情況下,它們可能每個人都會有更少或更多的煩人... – FallenAngel

+0

這就像化妝豬 - 它沒有多大幫助。不過,中間的想法是最好的。在一個函數中隱藏醜陋比在代碼中遍佈所有方式更好。 –

0

我補充一點,我只是覺得自己的另一種可能性。子類string.Formatter並添加自定義轉換器,這樣你就可以鍵入

fmt = MyFormatter() 
print fmt("Problem {not!w} solved", not="") 

格式化,然後將與!w轉換器的所有字段之前刪除的空間,如果變量是空的/沒有規定。這需要重新實現至少vformatconvert_field方法,但它應該是相當可行的。