【问题标题】:How to get an object inside an array list by its property value in Python如何通过Python中的属性值获取数组列表中的对象
【发布时间】:2013-11-08 20:59:07
【问题描述】:

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

【问题讨论】:

    标签: python list object


    【解决方案1】:

    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 类函数来匹配部分结构。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      【解决方案3】:

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

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 2013-01-02
        相关资源
        最近更新 更多