Распаковка 1-кортежа в списке длины 1

Предположим, у меня есть кортеж в списке вроде этого:

>>> t = [("asdf", )]

Я знаю, что список всегда содержит один 1-кортеж. В настоящее время я делаю это:

>>> dummy, = t
>>> value, = dummy
>>> value
'asdf'

Есть ли более короткий и элегантный способ сделать это?


person Björn Pollex    schedule 10.07.2010    source источник


Ответы (2)


Пытаться

(value,), = t

Это лучше, чем t[0][0], поскольку также утверждает, что ваш список содержит ровно 1 кортеж с 1 значением.

person Lior    schedule 10.07.2010
comment
Я только что проверил это, и это не работает. К сожалению, он не уходит из первоначального списка. - person Jason Wirth; 31.03.2013
comment
Пример в вопросе работает. Что именно вы пытались сделать? - person Lior; 10.04.2013
comment
Мои извинения, я попробовал еще раз, и это работает. Я не уверен, почему это не работало раньше; все, что я могу думать, это то, что я пропустил , после value. - person Jason Wirth; 12.04.2013

Попробуйте [(val, )] = t

In [8]: t = [("asdf", )]

In [9]: (val, ) = t

In [10]: val
Out[10]: ('asdf',)

In [11]: [(val, )] = t

In [12]: val
Out[12]: 'asdf'

Я не думаю, что есть чистый способ сделать это.

val = t[0][0] — мой первоначальный выбор, но он выглядит некрасиво.

[(val, )] = t тоже работает, но тоже выглядит некрасиво. Я думаю, это зависит от того, что легче читать и что вы хотите выглядеть менее уродливым, val или t

Мне понравилась идея Лиора о том, что распаковка списка и кортежа содержит утверждение.

In [16]: t2 = [('asdf', ), ('qwerty', )]

In [17]: [(val, )] = t2
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-73a5d507863a> in <module>()
----> 1 [(val, )] = t2

ValueError: too many values to unpack
person Jason Wirth    schedule 31.03.2013