Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多键dict在某些字符串上不起作用_Python_Dictionary_Python Import_Qgis - Fatal编程技术网

Python 多键dict在某些字符串上不起作用

Python 多键dict在某些字符串上不起作用,python,dictionary,python-import,qgis,Python,Dictionary,Python Import,Qgis,我想在dict键上迭代,如答案中所述。 但是在一些字符串上我得到了错误。 我的环境是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_

我想在dict键上迭代,如答案中所述。 但是在一些字符串上我得到了错误。 我的环境是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行,在 停止迭代

它仅在某些字符串上作为ID_WS_int代替ID_WS_int或PGM_START_代替PGM_START_DATE

我不明白为什么导入会改变事情

这是导入的dict:

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',
}

进口与此无关

列表中的检查字符串是否精确匹配

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

在第二种情况下,由于您的字符串仅在忽略大小写的情况下匹配,中的
元组中找不到该项,因此生成器为空,您将得到
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')

(如果未找到,则返回
None
)。如果k中的“ID\u WS\u int”因为大小写问题而不起作用,那么这将更有效、更具python风格。

。写
如果k中的'ID\u WS\u INT'使用windows路径的原始字符串
顺便说一句,否则您会有惊喜:
sys.path.append(r'C:\workspace\script')
好的,谢谢您的建议好的,谢谢。创建一个新的dict工作得很好,但是很抱歉,我不能添加+1,没有足够的点'newdict={k.upper():v代表t,v代表dictalias.items()代表t}中的k'生成了错误的键值。它以实际密钥的第一个字母代替密钥本身。但我之所以这么说,是因为我认为这并不是完全错误的。应用于你的数据的这个公式给出了
{PGM_开始日期:'首秀节目','ID_WS_INT':'B1','PGM_开始':'首秀节目','PGM_开始':'首秀节目','ID_WS':'B1}
,所以它是正确的。我已经测试过了。你改变输入数据了吗?没有,但这只是一个摘录,因为我有50多行。但是我创建了一个新的dict,它用一行一行的键来表示相同的值,它工作得很好。下一次当你有一个问题的答案,可以不接受,但最好是ping海报,让他/她可以解决这个问题。一些海报几乎不会注意到这种不可接受的情况,你也不会有自己的解决方案。无论什么为此干杯。