2013-01-03 26 views
2
x = WAIT100MS 
subroutines = ["WAIT"+str(range(1,256))+"MS"] 
if x in subroutines: 
    print "success" 
else: 
    print "invalid" 

我試圖創建一塊地方,如果WAITXMS1255之間,它將被接受的代碼,否則不會。 範圍()函數只是生成列表,所以我想我將能夠使用的Python:使用範圍()與「」。加入()

" ".join("WAIT"+str(range(1,256))+"MS")

與像x字符串結束。 但是使用join()功能與range()似乎並不像我所期望的那樣工作,而是給我一個像"WAIT[1,2,3,4,...]MS"一樣正常的列表。我該怎麼辦?

+1

想想事情發生的順序。您生成範圍,然後將其變成一個字符串,然後嘗試進行連接。事情沒有秩序。 –

+1

mgilson的答案將解決眼前的問題,但實際上,你應該在這裏使用正則表達式。 –

+0

你是否真的需要這個'list'用於除了檢查'if in子程序'以外的任何目的?如果是這樣,那麼Mark Ransom已經解釋了這個問題,並通過mgilson解決了這個問題。如果不是,那麼(a)它比'list'更好,並且(b)最好不要明確地生成它,可能使用某種形式的字符串處理,並且NPE提供了一個很好的解。 – abarnert

回答

3

我想你想要的東西,如:

''.join("WAIT%dMS"%i for i in range(1,256)) 

這裏有一個更好的辦法,我認爲:

def accept_string(s): 
    try: 
     i = int(s[4:-2]) 
    except ValueError: 
     return False 
    return s.startswith('WAIT') and s.endswith('MS') and (1 <= i < 256) 
+0

非常感謝。小的語法錯誤... i = int(s [4:-2]))應該是i = int(s [4:-2]) 否則輝煌! – AnotherLongUsername

+0

@AnotherLongUsername - 謝謝。現在已經修復了。 – mgilson

3

我會做這樣的事情:

x = "WAIT100MS" 
m = re.match(r"WAIT(\d+)MS$", x) 
accept = m is not None and 1 <= int(m.group(1)) <= 255 

我認爲遍歷所有可接受的數字(更不用說建立和存儲所有WAIT<n>MS字符串)是不必要的浪費。

+0

啊,所以這是OP想要做的。我很難弄清楚OP在嘗試什麼...... – mgilson

0

爲什麼重新切片時可以切片?

x = 'WAIT100MS' 
n = int(x[4:-2]) 
if 1 < n < 256: 
    print 'success' 
else: 
    print 'invalid' 
+0

這不能接受WAIT1MS,並且可能錯誤地接受不以「WAIT」開頭或以「MS」結尾的輸入。 – NPE

+0

其實它接受'WAIT1MS',用2.x和3.x都可以使用,它可以工作。當然,你的解決方案更好地描述了需求,但如果你認爲語法理所當然,那麼切片是一種實用的方式。 –

+0

我不想繼續討論這個問題,但是如何將'1 <1 <256'評估爲'True',這就是你所說的? – NPE