【问题标题】:Get index of object in python using value without looping使用值在python中获取对象的索引而不循环
【发布时间】:2017-12-08 14:45:46
【问题描述】:

所以基本上我有这个:

data = [
    {
        "id" : "hello",
        ...
    },
    {
        "id" : "world",
         ...
    }
]

我想得到结果:

"1" 

如果我输入如下内容:

get_index(id="world")

主要是我不想遍历数组,因为其中有很多数据。如果我要循环它会很容易,我最终会得到一些代码,例如:

for obj in data:
    if obj['id'] == 'hello':
        print(obj['id'])

但是有没有一种不循环的直接方法呢?

【问题讨论】:

  • 如果按字母顺序排序的 ID 不仅仅是示例的巧合,您可以使用二等分搜索。但总的来说:不,这将是一个 O(n) 操作,除非您可以利用有关数据结构的一些额外信息。
  • 好的,谢谢。您能否在答案中这么说,以便我可以将其称为已接受?
  • 嗯,在这个特殊的用例中,你很容易说我不想循环,因为有很多数据。但是你真的知道确切的您要查找的信息的位置?可能不是。如果可能,您可以使用适当的数据结构(如集合)来优化搜索。但是您要求在不实际搜索的情况下搜索项目的解决方案。这是不可能的。
  • 主要问题是我无法控制这些数据。我是由别人提供的。否则,我只想提供一个简单的解决方案......

标签: python arrays list


【解决方案1】:

只要您不能以某种方式利用数据的特定结构,就不可能比您描述的循环更有效地执行此操作。

【讨论】:

  • 这与 cmets 所说的有何不同。我没有看到您的答案的附加值。特别是因为它没有提供有关如何实现 PO 想要的任何见解。
  • 作者问有没有直接的方法,没有。因此,我的答案是回答问题......
【解决方案2】:

您必须至少遍历整个数组一次。

但是,如果您需要在数组中搜索许多不同的键,您可以建立一个索引:

>>> data = [
...     {
...         "id" : "hello",
...     },
...     {
...         "id" : "world",
...     }
... ]
>>> get_index= {item["id"]:counter for (counter, item) in enumerate(data)}
>>> get_index["hello"]
0
>>> get_index["world"]
1
>>>

由于您现在有一个查找表,因此对 id 的查询现在应该是恒定时间操作: How expensive are Python dictionaries to handle?

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 2015-07-22
    • 2021-06-04
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多