多键dict不能处理某些字符串

时间:2017-03-09 07:18:38

标签: python dictionary python-import qgis

我希望迭代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',
}

1 个答案:

答案 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。