多键字典不适用于某些字符串
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。
我想按照 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。