多键字典不适用于某些字符串

Multi key dict not working on some strings

我想按照 SilentGosht 答案中的说明迭代字典键。 但是在某些字符串上我得到了错误。 我的环境是QGIS 2.14 python terminal

这是我的命令:

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)

我得到:

Traceback (most recent call last): File "", line 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',
}

导入与此无关。

列表中的

in 检查字符串是否完全匹配。

第一个示例有效 PGM_START_ 因为您尊重案例。

在第二种情况下,由于您的字符串仅在我们忽略大小写时才匹配,因此 in 无法在 tuple 中找到该项目,生成器为空,您将获得 StopIteration错误。

那个问题的快速修复:

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')

(如果未找到,则 returns None)。这样会更高效,更符合 pythonic。