在python中,如果我有一个元组元组,就像这样:
((1, 'foo'), (2, 'bar'), (3, 'baz'))
返回包含特定第一个元素的元组的第0个元素的最有效/干净/ pythonic方法是什么。我假设它可以作为一个简单的单行完成。
换句话说,如何使用'bar'返回2?
这是我正在寻找的笨重的东西,如果不清楚的话:
for tup in ((1, 'foo'), (2, 'bar'), (3, 'baz')):
if tup[1] == 'bar':
tup[0]
答案 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
如果您多次执行此操作,请将该元组列表转换为dict:
>>> d = {v:k for k,v in ((1, 'foo'), (2, 'bar'), (3, 'baz'))}
>>> d['bar']
2
>>> d['foo']
1
答案 1 :(得分:2)
>>> lis = ((1, 'foo'), (2, 'bar'), (3, 'baz'))
>>> dict(map(reversed, lis))['bar']
2
答案 2 :(得分:0)
这将是一种“功能性”的方式:
filter(lambda x: x[1]=='bar',((1, 'foo'), (2, 'bar'), (3, 'baz')))[0][0]
或者从elazar借钱,因为我非常喜欢它:
dict(map(lambda x: (x[1],x[0]),((1, 'foo'), (2, 'bar'), (3, 'baz'))))['bar']
或者确实像elazar所说的但是在一个oneliner:
dict(map(reversed,((1, 'foo'), (2, 'bar'), (3, 'baz'))))['bar']
答案 3 :(得分: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')