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

11

这个列表类似于这样:

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

这个列表是否按照第一项排序了?你需要再做多次吗? - jcklie
重要的是要知道列表是否以某种方式排序,因为如果是这样,您可以使用二分搜索来改进搜索以使其真正快速。 - Paulo Bu
@reindeer:是的,你可以对它进行排序,实际上每个项目的第一个值是日期,但它们不是连续的(缺少很多天),所以基本上我需要获取那一天的数据。 - Shane
4个回答

14

没有遍历,除非列表已经排序,否则您无法找到它。您可以使用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

OP说第一个值是唯一的ID,所以列表推导式并不是必需的。 - Henrik
@Henrik 请现在检查一下 :) - thefourtheye
1
是的,包括常规函数很好。列表推导式好用并不意味着老式的函数不好 :) - Henrik

12

还没有人提到这一点,所以我来说一下——如果您需要快速按其值查找项目(并且可能不止一次),则应将使用的数据结构更改为支持您需要的访问方式。列表通过索引支持快速访问,但不支持通过项目值进行访问。如果您将信息存储在由列表中第一个元素作为键的字典中,则可以通过该第一个值非常快速地找到行:very

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

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

简短的回答是否定的(尽管如果列表已排序,使用二分法可以有一种相对快速的方法),更长的回答是如果你想要快速查找,请使用字典。


3
我们迭代这个列表不是为了查找元素,而是为了将列表转换成字典。只有当我们需要多次搜索元素时才值得这样做。如果您需要执行100次查找,最好进行1次完整迭代,然后进行100次快速查找,而不是进行100次半迭代(平均而言)。 - babbageclunk
感谢 @EMS 帮忙修正拼写错误! - babbageclunk

2
如果您可以绝对保证所需的密钥只存在一次,这个方法也可以运行。
import itertools
itertools.ifilter(lambda x: x[1][0] == "332", enumerate(theList)).next()[0]

如果您将其修改为使用生成器对象而不是立即调用next,它将适用于获取多个出现次数。

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


2
如果该关键字恰好出现一次,
zip(*thelist)[0].index("332")

2
很确定你想要使用zip(*thelist)[0].index("332") - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接