我想在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
答案 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
)