3

在 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]
4

4 回答 4

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
于 2013-06-27T22:34:57.817 回答
2
>>> lis = ((1, 'foo'), (2, 'bar'), (3, 'baz'))
>>> dict(map(reversed, lis))['bar']
2
于 2013-06-27T22:39:54.960 回答
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 所说的,但在单行中:

dict(map(reversed,((1, 'foo'), (2, 'bar'), (3, 'baz'))))['bar']
于 2013-06-27T22:36:22.027 回答
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')
于 2013-06-27T22:37:05.047 回答