我希望迭代dict键,如SilentGosht答案中所述。 但在一些字符串上我得到错误。 我的环境是QGIS 2.14 python终端
这是我的词:
dictAliases = {
('ID_WS_INT','ID_WS'): 'B1',
('PGM_START','PGM_START_DATE','PGM_START_'): 'Debut programme'
}
这里我的代码迭代dict:
next(v for k, v in dictAliases.items() if 'PGM_START_' in k)
工作正常
但是如果将dict放在一个单独的文件中并将其导入为:
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行,in 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',
}
答案 0 :(得分:1)
导入与此无关。
列表中的 in
检查确切的字符串匹配。
第一个例子有效PGM_START_
,因为你尊重这个案子。
在第二种情况下,由于我们的字符串仅在我们忽略大小写时匹配,in
无法在tuple
中找到该项,因此生成器为空,并且您获得{{1错误。
那个的快速修补程序:
StopIteration
如果您不了解此案例,可以使用next(v for k, v in osirisdict.dictAliases.items() if 'ID_WS_INT' in k)
并按比较any
版本的项目来解决此问题:
uppercase
但它仍然是一种执行查找的非常高效的方法,你根本就没有使用字典查找速度。
我建议您使用元组项目创建一个新的字典,其中包含1个键(大写):
next(v for k, v in dictAliases.items() if any('ID_WS_INT'==i.upper() for i in k))
赋予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')
)。这将更有效,更pythonic。