如何通过Python中的属性值获取数组列表中的对象

时间:2013-11-08 20:59:07

标签: python list object

我正在尝试编写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"})

3 个答案:

答案 0 :(得分:2)

Python列表 do 具有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 - 类似于部分结构的函数。

答案 1 :(得分: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

答案 2 :(得分: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)