首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按给定索引在列表列表中搜索

按给定索引在列表列表中搜索
EN

Stack Overflow用户
提问于 2009-07-20 21:34:26
回答 13查看 191.1K关注 0票数 64

我有一个包含两个项目的列表,需要在其中搜索内容。

如果列表是:

代码语言:javascript
运行
复制
list = [['a','b'], ['a','c'], ['b','d']]

我可以通过执行以下操作轻松地搜索一对

代码语言:javascript
运行
复制
['a','b'] in list

现在,有没有办法来看看我是否有一个字符串出现在第二个位置的对?我可以这样做:

代码语言:javascript
运行
复制
for i in range (0, len(list)):
    if list[i][1]==search:
       found=1

但是有没有一种(更好的)方法不使用for循环呢?我不需要知道i,也不需要在找到它之后继续循环。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2009-07-20 21:39:56

你总会有一个循环--有人可能会想出一个聪明的一行程序,将循环隐藏在对map()或类似程序的调用中,但它总是会存在的。

除非性能是一个主要因素,否则我更喜欢拥有干净和简单的代码。

下面是您的代码的一个更具Pythonic风格的版本:

代码语言:javascript
运行
复制
data = [['a','b'], ['a','c'], ['b','d']]
search = 'c'
for sublist in data:
    if sublist[1] == search:
        print "Found it!", sublist
        break
# Prints: Found it! ['a', 'c']

一旦找到匹配项,它就会跳出循环。

(顺便说一下,您在['b''d']中有一个拼写错误。)

票数 51
EN

Stack Overflow用户

发布于 2009-07-20 21:47:28

下面是Pythonic式的方法:

代码语言:javascript
运行
复制
data = [['a','b'], ['a','c'], ['b','d']]
search = 'c'
any(e[1] == search for e in data)

或者..。我不会说这是“一种真正的Pythonic方式”,因为在某种程度上,什么是Pythonic,什么不是,或者哪种方法比另一种方法更Pythonic,会变得有点主观。但是使用any()肯定比在例如RichieHindle's answer中的for循环更典型的Python风格,

当然,在any的实现中有一个隐藏的循环,尽管一旦找到匹配,它就会中断循环。

因为我很无聊,所以我做了一个计时脚本来比较不同建议的性能,根据需要修改其中的一些建议,以使API相同。现在,我们应该记住,最快并不总是最好的,而且快速绝对不是Pythonic式的东西。话虽如此,结果是...真奇怪。显然,for循环的速度非常快,这不是我所期望的,所以我对它们持保留态度,并不理解它们为什么会这样。

无论如何,当我使用问题中定义的三个子列表,每个子列表包含两个元素时,从最快到最慢,我得到了以下结果:

  1. RichieHindle's answer与代码循环,以0.22μs
  2. Terence Honles' first suggestion计时,它在0.36μs
  3. Pierre-Luc Bedard's answer (last code block),、0.43μs
  4. Essentially时创建一个列表,在0.48μs
  5. Coady's answer使用operator.itemgetter()时,在Markus's answer和来自the original questionfor循环之间,在0.53 for
  6. 时,足够接近到Alex Martelli's answerifilter()和<μ>c29之间的关系,在0.67s时(Alex的大约是0.5微秒,在jojo's answer、faster)
  7. Another、Brandon E Taylor's (和我的一样)和使用any()Terence Honles' second suggestion之间的关系足够紧密,所有这些都是在0.81-0.82s
  8. 和0.95μs

上使用嵌套列表理解的

显然,实际的计时在其他任何人的硬件上都没有意义,但它们之间的差异应该可以让我们对不同方法的接近程度有所了解。

当我使用一个较长的列表时,情况会发生一些变化。我从问题中的列表开始,有三个子列表,并附加了另外197个子列表,总共有200个子列表,每个子列表的长度为2。使用这个较长的列表,结果如下:

  1. RichieHindle's answer,与使用较短的list
  2. Coady's answer相同的0.22Code,同样是在0.53μs
  3. Terence Honles' first suggestion,它创建了一个列表,在0.36Code s Alex Martelli's answerifilter()Anon's answer之间的另一个虚拟关系,在0.67Code
  4. 再次在我的答案,Brandon E Taylor's相同的方法和使用<μ>D60的<μ>C59之间建立了足够紧密的关系,所有这些都出现在0.81-0.82μs <代码>H261<代码>G262

这些是在列表扩展时保持其原始计时的那些。其余的,不是,是

在1.24μs

  1. for循环从the original question创建一个列表,在7.49μs
  2. Pierre-Luc Bedard's answer (last code block),,8.12μs
  3. Markus's answer,,10.27μs
  4. jojo's answer,,19.87
  5. ,最后user27221's answer使用嵌套列表理解,在60.59μs
票数 82
EN

Stack Overflow用户

发布于 2009-07-20 21:47:42

代码语言:javascript
运行
复制
>>> the_list =[ ['a','b'], ['a','c'], ['b''d'] ]
>>> any('c' == x[1] for x in the_list)
True
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1156087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档