2017-03-09 75 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