1

我正在尝试编写一个插件并在文件中Sublime Text 2获取一些值。.subilme-settings

{
"files":
    [
        {
            "name" : "Markdown",
            "extension" : ".md"
        },{
            "name" : "Python",
            "extension" : ".py"
        },{
            "name" : "Sublime Text Setting",
            "extension" : ".sublime-settings"
        }
    ]
}

这是我第一次使用Python,我不知道该怎么做,确实存在类似:

my_array.indexOf({"extension":".py"})
4

3 回答 3

2

Python 列表确实有一个index方法。但它只查找等于参数的值,而不是具有与您的部分值匹配的参数的值。

Python 中真的没有任何东西可以找到像这样的部分结构匹配;您可以搜索/过滤/等。关于相等,或谓词函数,但你必须自己编写任何其他内容。

最简单的方法是使用循环。您可以明确地编写它:

for index, element in enumerate(my_array):
    if element["extension"] == ".py":
        return index

……或者理解:

return next(index for index, element in enumerate(array)
            if element["extension"] == ".py")

或者,您可以将匹配转换为函数,并将其传递给filter,或将其用作key更复杂的高阶函数中的函数,但这里似乎没有任何真正的优势。

当然,如果需要,您可以编写自己的indexOf类似部分结构的函数。

于 2013-11-08T21:04:14.263 回答
1

您可以编写自己的函数来获取索引:

>>> my_dict = {'files': [{'name': 'Markdown', 'extension': '.md'}, {'name': 'Python', 'extension': '.py'}, {'name': 'Sublime Text Setting', 'extension': '.sublime-settings'}]}
>>> def solve(key, val, lis):
        return next((i for i, d in enumerate(lis) if d[key] == val), None)
... 
>>> solve('extension', '.py', my_dict['files'])
1
于 2013-11-08T21:04:06.667 回答
0

这可能不是最好的解决方案,但你可以试试这个:

i=0
for element in files:
    if '.py' in element:
        break
    else:
        i+=1

在这个循环结束时,如果它找到了你想要的扩展名,'i' 将是你正在寻找的索引。但是,如果您想要一个带有扩展名的每个元素的列表:

myElements=[]
for element in files:
    if '.py' in element:
        myElements.append(element)
于 2013-11-08T21:07:10.917 回答