Распаковка 1-го кортежа в список длиной 1 - PullRequest
7 голосов
/ 10 июля 2010

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

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 10 июля 2010

Попробуйте

(value,), = t

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

10 голосов
/ 10 июля 2010
>>> t = [("asdf", )]
>>> t[0][0]
'asdf'
0 голосов
/ 31 марта 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
...