2010-01-14 31 views
1

嗨我想知道是否有可能在代碼的while比較部分中分配一個值。在一段時間比較表達式中分配值

下面是代碼的例子目前

startIndex = find(target, key, startIndex) 
while(startIndex != -1): 
    matchesFound += 1 
    startIndex = find(target, key, startIndex + 1) 
return matchesFound 

我想要做的是移動的startIndex =發現(目標,關鍵,則startIndex)進入,而比較expresion所以它會是這個樣子

while((startIndex = find(target, key, startIndex)) != -1): 
    matchesFound += 1 
    startIndex + 1 
return matchesFound 

如果不是,那麼更好的重構是什麼?

感謝

編輯 我通過MIT開放課件6.00工作之前,我嘗試了著名6.001模塊

+0

答案仍然沒有。重複:http://stackoverflow.com/questions/1663995/python-variable-assignment-and-if-statement – 2010-01-14 01:04:11

+0

這兩個都是一樣的嗎?在第一種情況下,你首先用'startIndex'調用'find',而在後者中用'startIndex + 1'調用它。 – 2010-01-14 01:13:25

+0

是的,你是對的彼得我已經糾正它 – Sam 2010-01-14 01:29:25

回答

2

如果由於某種原因,你不能用一個更合適的方法從任何你要搜索,這相當於從問題的工作代碼:

start = 0 
count = 0 
for match in iter(lambda: find(target, key, start), -1): 
    count += 1 
    start = match + 1 
return count 

但是,你會得到最從里程寫一個迭代器找到這些比賽,「轉化」當前的查找功能:

def findall(target, key, start=0): 
    for match in iter(lambda: find(target, key, start), -1): 
    yield match 
    start = match + 1 

然後從數:

count = sum(1 for m in findall(target, key)) 
+0

+1首先是Pythonic *和*(更重要的)實際上與OP的第一個行爲示例相匹配。 – 2010-01-14 01:17:58

+0

我不確定更多pythonic,循環半是一個很好的候選人,但這個問題似乎只是示例代碼,這種形式的iter()可能在他的實際工作中更好地工作。 :)(我也假定startIndex從0開始,但沒有說明,儘管顯然這很容易改變。) – 2010-01-14 01:20:10

+0

我在做麻省理工學院6.00課程的作業,這個作業只是寫了兩個函數(一個iterativly和一個遞歸)來計算一個關鍵字符串出現在目標字符串中的次數 – Sam 2010-01-14 01:26:29

0

不,你不能這樣做在Python。我認爲Python不允許這樣做的主要原因是爲了避免由於賦值和相等性檢查混淆而導致的頻繁錯誤。

Python聲稱具有可讀代碼作爲主要指導原則,所以我認爲你的原代碼是好的。不需要重構...

1

您正在Python中編寫C語言。

嘗試:

startIndex = -1 
while True: 
    startIndex = find(target, key, startIndex + 1) 
    if startIndex < 0: 
     break 
    matchesFound += 1 
return matchesFound 

或者甚至是:

return target.count(key) 
+1

這與OP的代碼不符。顯然,在第一次調用之後,startIndex需要加1。 – 2010-01-14 01:09:30

+0

+1認可作爲C慣例...雖然我敢肯定它在其他語言是合法的。 – 2010-01-14 01:11:19

+0

我實際上做了一個14個月的安置,我是在C編程 – Sam 2010-01-14 01:15:40

0

我會做這樣的

startIndex=0 
while 1: 
    startIndex = find(target, key, startIndex+1) 
    if startIndex == -1: break 
    matchesFound += 1 

你可以把更多的條件,如一個while循環中。

編輯:@OP,今後數字符串匹配,只是使用計

>>> mystring = "abc defabc fgh ijkabc blah" 
>>> mystring.count("abc") 
3 
>>> 
+0

也明顯不符合OP的代碼,其中'startIndex'在第一次調用之後被傳入1。 – 2010-01-14 01:10:03

0

編輯。

我們這樣重構它。

matches = [ k for k in range(len(target)-len(key)) if target[k:].startswith(key) ] 
matchesFound = len(matches) 

我們不需要C風格的條件和分配合並。

很少你只是想要數;實際位置可免費使用。