2017-03-09 105 views
1

我想按照SilentGosht答案中的解釋在字典鍵上進行迭代。 但是,在一些字符串我得到錯誤。 我的環境是QGIS 2.14蟒蛇終端多鍵字典無法在某些字符串上工作

這裏是我的字典:

dictAliases = { 
('ID_WS_INT','ID_WS'): 'B1', 
('PGM_START','PGM_START_DATE','PGM_START_'): 'Debut programme' 
} 

這裏我的代碼,反覆字典:

next(v for k, v in dictAliases.items() if 'PGM_START_' in k) 

它工作正常

,但如果把字典在一個單獨的文件中,並將其導入爲:

import sys 

sys.path.append('C:\workspace\script') 
import osirisdict 
next(v for k, v in osirisdict.dictAliases.items() if 'ID_WS_int'in k) 

我得到:

回溯(最近通話最後一個):文件 「」,1號線,在 的StopIteration

它僅適用於某些字符串作爲ID_WS_int到位ID_WS_INT的PGM_START_到位PGM_START_DATE的

我不明白爲什麼進口變化的東西

這裏是進口的字典:

dictAliases = { 
('ID_WS_INT','ID_WS'): 'B1', 
('PGM_START','PGM_START_DATE','PGM_START_'): 'Debut programme', 
('IMP_TYPE_F','IMP_TYPE_FR'): 'Type impetrant', 
('PGM_START','PGM_START_DATE','PGM_START_'): 'Debut programme', 
} 
+1

'if'ID_WS_int'in k' does not work because casing case matter。寫'if'ID_WS_INT'in k' –

+0

順便說一句,使用原始字符串作爲windows路徑或者你會有驚喜:'sys.path.append(r'C:\ workspace \ script')' –

+0

好的,謝謝你的建議 – jlSta

回答

1

進口無關這一點。

in在列表中檢查確切的字符串匹配。

第一個例子工作PGM_START_,因爲你尊重案件。

在第二種情況下,由於您的字符串只在匹配時忽略大小寫,因此in無法找到tuple中的項目,因此生成器爲空,您將收到StopIteration錯誤。

的QuickFix爲一個:

next(v for k, v in osirisdict.dictAliases.items() if 'ID_WS_INT' in k) 

如果你不知道的情況下,您可以修復它下面使用any和按鍵比較uppercase版本的項目的方式:

next(v for k, v in dictAliases.items() if any('ID_WS_INT'==i.upper() for i in k)) 

但是,它仍然是一種非常不可行的方式來執行查找,你根本沒有使用字典查找速度。

我建議你建立一個新的字典,用1個鍵(大寫)的元組項目:

newdict = {k.upper():v for t,v in dictAliases.items() for k in t} 

這給了newdict

{'PGM_START_DATE': 'Debut programme', 'ID_WS_INT': 'B1', 'PGM_START_': 'Debut programme', 'PGM_START': 'Debut programme', 'ID_WS': 'B1'} 

然後你就可以訪問使用get元素:

newdict.get('ID_WS_INT') 

(返回None如果沒有找到)。這將更有效率,更pythonic。

+0

好的謝謝。創建一個新的字典完美的作品,但對不起,我不能添加+1,沒有足夠的分數 – jlSta

+0

你接受答案的任何理由? –

+0

'newdict = {k.upper():v for t,v in dictAliases.items()for k in t}'生成錯誤的鍵值。它取代真正密鑰的第一個字母代替密鑰本身。但我明白這一點,因爲我認爲這並非完全錯誤。 – jlSta