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

时间:2010-02-05 08:53:02

标签: python

我想在tuple of tuples中搜索特定字符串并返回父元组的索引。我似乎经常遇到这种搜索的变种。

最狡猾的方式是什么?

即:

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

5 个答案:

答案 0 :(得分:4)

  

它有诀窍,但我有这个想法,它可能有一个单行;)

单行可能这样做的pythonic方式:)

您使用的方法看起来很好。

修改

如果你想变得可爱:

return next( (i for i,(k,v) in enumerate(items) if k=='Spock'),None)

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

答案 1 :(得分:4)

或者你可以这样做:

dict(derp)[<key_name>]

例如

dict(derp)['Cat']

会给你'宠物'

答案 2 :(得分:1)

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

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

print lookup_table['Spock']
--> 2

答案 3 :(得分:0)

将它排在一行的另一种方法是:

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

我不确定迭代器是否在调用index之前计算所有值,因此效率低下。

答案 4 :(得分:-1)

Lambdas很有趣!

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