2013-05-15 73 views
0

我想測試一個字典,看看它是否包含包含部分字符串的鍵。具體來說,我正在構建一個翼發生器,將每個羽毛的控制權分配給字典。點擊一個按鈕來鏡像機翼,我需要測試機翼是否已經被鏡像(然後如果它已經被撤消/刪除,但這不是這個問題的一部分,並且很容易測試)。我希望通過檢查羽毛字典來查看它是否包含同時包含「L_」和「R_」的Keys。字典是否包含包含多個部分字符串的密鑰?

下面的代碼做我想要的,但是相當詳細。這裏一定是一個更簡單,更優雅的方式來做到這一點:

dict={} 
RS=False 
LS=False 
for each in dict: 
    if "L_" in each: 
     LS=True 
    if "R_" in dict: 
     LS=True 
if LS and RS: 
    print "has both" 

或者,將它只是簡單的創建另一個全局變量和存儲鏡像真/假值成用於測試?我試圖儘量減少我的全局變量,但我們不確定它們如何影響資源。任何意見,將不勝感激。

+0

你確定代碼做你想要的嗎?我認爲你的意思是,如果在每個中都有R_,你就重複LS = True而不是RS = True。另外,你的意思是在循環內有'如果LS和RS:'?如果是這樣,你不需要重複LS和RS爲False每次迭代?如果您使代碼正常工作,這裏的人員可以更輕鬆地向您展示使代碼更好的方法。 –

回答

1

這種方式不太詳細,有機會在找到匹配關鍵字時提前中斷搜索,但在最壞的情況下仍然會在關鍵字上進行兩次完整傳遞。

if any('L_' in key for key in dict) and any('R_' in key for key in dict): 
    print 'has both' 

注:這是在你的問題有點含糊,如果你正在尋找L_R_出現在相同鍵或不(例如:"...L_...R_...")。如果是這樣的話,使用方法:

if any('L_' in key and 'R_' in key for key in dict): 
    print 'has both' 

這種方式是更冗長,但只要有可能爆發,而只會讓一個人在最壞的情況下,即使通過。

RS=False 
LS=False 
for each in dict: 
    if "L_" in each: 
     LS=True 
    if "R_" in dict: 
     RS=True 
    if LS and RS: 
     print 'has both' 
     break 

您使用我想取決於是否需要進行優化,如果你在你的字典裏有很多按鍵,只有使在最壞的情況下,一個通將是有益的。

+0

謝謝。看起來我並沒有遠離第二種選擇,但是不太詳細的方法也很好理解。非常感激。 – Kratch

0

當你在第一個地方建立字典時,有兩個不同的字典。將這些值放入正確的字典中(根據您的描述,這可能是兩種情況)。其實,有一本兩本字典。

然後這個搜索問題不會發生。

+0

我使用單獨創建每個羽毛的單獨方法創建羽毛(羽毛數量可變),然後將控件名稱分配給字典。當我鏡像時,我使用基於對邊字典長度的羽毛數值運行相同的方法(然後運行新方的每個控件並從相反側的羽毛控件複製屬性)。因爲創建雙方的方法相同,所以它使用相同的字典。所以我不確定第二羽羽毛字典是否可行,或比「鏡像測試」全局變量更好。 – Kratch

+0

@Kratch這聽起來好像你不應該分開雙方,如果是這樣的話。我發現你的描述太模糊不清,以至於推薦更合適的數據結構,但我確信它們存在。 – Marcin

0

如果你想用一個更實用的風格,你可以建立根據你的等級進行分類的羽毛功能:

def classify(s): 
    return set(['L']) if 'L_' in s else set(['R']) 

然後,只需申請一個減少你的鑰匙:

wing = {'L_feather': 6 , 'R_feather' : 5} 
reduce(lambda x, y: classify(x) | classify(y), wing) 

結果在一個包含兩個惠特你可以很容易地檢查與len().issubset()或其他:

Out[30]: 
set(['R', 'L']) 

這應該只橫過你的列表一次。