在python中查找列表中列表元素的最快方法是什么?

时间:2013-12-19 13:35:06

标签: python list python-2.7

列表与此类似:

[["12", "stuA", "stuB"], ["51", "stuC", "stuD"], ..., ["3234", "moreStuff", "andMore"]]

现在我需要仅通过其第一个值(例如"332")来定位项目(获取索引)。有没有更好的方法来做到这一点,除了从第一个迭代以与每个值进行比较?

代码:

index = 0
for item in thelist:
    if item[0] == "332":
         print index

    index = index + 1

4 个答案:

答案 0 :(得分:12)

否。如果没有迭代,则无法找到它,除非列表已经排序。您可以使用enumerate和列表理解来改善您的代码。

[index for index, item in enumerate(thelist) if item[0] == "332"]

这将给出第一个元素为332的所有元素的索引。

如果您知道332只出现一次,则可以执行此操作

def getIndex():
    for index, item in enumerate(thelist):
       if item[0] == "332":
          return index

答案 1 :(得分:9)

没有人提到这一点,所以我会 - 如果你需要快速找到一个项目的价值(并且可能不止一次),你应该改变你用来支持那种类型的数据结构。访问你需要的。列表支持按索引快速访问,但不支持按项目值。如果您将信息存储在由列表中的第一个元素键入的dict中,您将能够通过第一个值快速找到行 very

# Make a dict from the list of lists:
itemLookup = {item[0]: item for item in theList}

itemLookup["51"] # -> ["51", "stuC", "stuD"]

所以简短的答案是否定的(尽管如果列表已经排序,有一种使用二分法的快捷方式),如果你想快速查找,则使用字典的答案就更长。

答案 2 :(得分:2)

如果你绝对可以保证你想要的密钥存在一次,那么这也可以。

import itertools
itertools.ifilter(lambda x: x[1][0] == "332", enumerate(theList)).next()[0]

如果您修改它以使用生成器对象而不是像我这样立即调用next,则可以使用多次出现。

如果可行的话,我建议将数据移动到dict格式(OrderedDict,如果出现位置很重要)这些整数作为键(因为你可以保证它们是唯一的) ,或者可能是以整数作为索引的pandas DataFrame。

答案 3 :(得分:2)

如果密钥恰好出现一次,

zip(*thelist)[0].index("332")