在Python中搜索一个二维元组/列表

5

我想在一个由元组嵌套而成的 元组 中搜索特定的字符串,并返回父元组的索引。我似乎经常遇到这种搜索的变体。

什么是最符合Python风格的方法?

例如:

derp = (('Cat','Pet'),('Dog','Pet'),('Spock','Vulcan'))
i = None
for index, item in enumerate(derp):
    if item[0] == 'Spock':
         i = index
         break
>>>print i
2

我可以将这个过程概括为一个小实用程序函数,该函数需要传入一个可迭代对象、一个索引值(在示例中我硬编码了0),以及要搜索的值。虽然这个函数能够完成任务,但是我认为可能有一种更简单的方法;)
例如:
def pluck(iterable, key, value):
    for index, item in enumerate(iterable):
        if item[key] == value:
             return index
    return None

你为什么想要索引而不是值? - user97370
只是一个特定的上下文。我有另一个函数,它接受一个元组和一个索引,然后说“索引i处的元组是当前活动的元组”。 - Koobz
5个回答

5

或者你也可以这样做:

dict(derp)[<key_name>]

eg.

dict(derp)['Cat']

这将为您提供“Pet”。


2
这个看起来比被接受的答案更优雅 - 有什么缺点吗? - Aaron Pollock
@AaronPollock,被标记的答案是在2010年2月发布的,而这个答案是在2012年11月发布的,可能是因为这个原因 :) - Siddharth Srivastava

4
它可以实现目的,但我有这种想法,可能有一个一行代码的解决方法 ;)
这个一行代码的方式可能不是Pythonic的做法 :)
你使用的方法看起来不错。 编辑: 如果你想可爱点:
return next( (i for i,(k,v) in enumerate(items) if k=='Spock'),None)

next 接受一个生成器表达式,并在生成器耗尽后返回下一个值或第二个参数(在本例中为 None)。


1

如果你经常搜索相同的元组,可以构建一个字典。

lookup_table = dict((key, i) for i, (key, unused) in enumerate(derp))

print lookup_table['Spock']
--> 2

0

另一种一行代码实现的方式是:

[d[0] for d in derp].index("Spock")

我不确定迭代器在调用索引前是否评估所有值,从而导致效率低下。

-1

使用Lambda很有趣!

return reduce(
    lambda x,(i,(a,b)): i,
    filter(
        lambda (i,(a,b)): a == "Spock",
        enumerate(depr)
    ),
    None
)

1
filter() 函数的问题在于:(1) 它总是会搜索整个列表,(2) 它会返回匹配项的列表,而不是任何匹配项的索引。 - Max Shawabkeh
(1) 真的 (2) 可以通过使用map或reduce来解决(请参见编辑后的帖子) - ron
顺便说一下,发布的原始代码很好,没有这个“缺陷”。热爱lambda表达式是个人的特质 ;) - ron
这段代码的函数式写法是 itertools.dropwhile(lambda a: a[0] != 'Spock', derp).next() - user97370
LOL也许这里有一个教训。该死的Python让我一直在犹豫自己的选择 ;)Ron的例子确实引导了我进入一些有趣的方向。还没有尝试过filter。整个“一种明显的方法来做到这一点”的理念去哪了呢 ;) - Koobz
显示剩余3条评论

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