2013-06-27 2 views
3

В питоне, если у меня есть кортеж кортежей, например так:Самый чистый способ вернуть кортеж, содержащий определенный элемент?

((1, 'foo'), (2, 'bar'), (3, 'baz')) 

, что является наиболее эффективным/чистым/вещим способом вернуть элемент 0-й кортеж, содержащего определенный 1-ый элемент. Я предполагаю, что это можно сделать как простой однострочный.

Другими словами, как мне вернуть 2, используя «бар»?


Это неуклюжим эквивалент того, что я ищу, в случае, если это не было ясно:

for tup in ((1, 'foo'), (2, 'bar'), (3, 'baz')): 
    if tup[1] == 'bar': 
     tup[0] 

ответ

8

Использование списка понимание, если вы хотите, чтобы все такие значения:

>>> lis = ((1, 'foo'), (2, 'bar'), (3, 'baz')) 
>>> [x[0] for x in lis if x[1]=='bar' ] 
[2] 

Если вы хотите только одно значение:

>>> next((x[0] for x in lis if x[1]=='bar'), None) 
2 

Если вы делаете это несколько раз затем преобразовать этот список кортежей в Словаре:

>>> d = {v:k for k,v in ((1, 'foo'), (2, 'bar'), (3, 'baz'))} 
>>> d['bar'] 
2 
>>> d['foo'] 
1 
0

Это будет «функциональный» способ сделать это:

filter(lambda x: x[1]=='bar',((1, 'foo'), (2, 'bar'), (3, 'baz')))[0][0] 

или заимствование из Элазар, потому что Мне нравится это так:

dict(map(lambda x: (x[1],x[0]),((1, 'foo'), (2, 'bar'), (3, 'baz'))))['bar'] 

или действительно как Элазар сказал, но в Oneliner:

dict(map(reversed,((1, 'foo'), (2, 'bar'), (3, 'baz'))))['bar'] 
0
t = ((1, 'foo'), (2, 'bar'), (3, 'baz')) 

try: 
    value = [x[0] for x in t if x[1]=='bar'][0] 
except IndexError: 
    raise Exception('Does not exist') 
2
>>> lis = ((1, 'foo'), (2, 'bar'), (3, 'baz')) 
>>> dict(map(reversed, lis))['bar'] 
2 
Смежные вопросы