web-dev-qa-db-ja.com

文字列をタプルに変換する

文字列「(1,2,3,4,5)、(5,4,3,2,1)」を取り、各タプルの最初と最後の要素のタプルのリストを返す関数を書く必要があります、[(1,5)、(5,1)]。私が考えていた:

def f(givenstring):
    a=givenstring.split(',')
    for i in a[0:-1]:
        Tuple(int(i[0,-1]))

しかし、ここで立ち往生しています。

24
Linus Svendsson

ast.literal_eval() を使用できます。

式ノードまたはPython式を含む文字列を安全に評価します。指定された文字列またはノードは、次のPythonタプル、リスト、辞書、ブール値、およびなし。

これは、自分で値を解析することなく、信頼できないソースからのPython式を含む文字列を安全に評価するために使用できます。

あなたの例では:

from ast import literal_eval
s = '(1,2,3,4,5),(5,4,3,2,1)'

l = literal_eval(s)
print l
# ((1, 2, 3, 4, 5), (5, 4, 3, 2, 1))

print [(x[0], x[-1]) for x in l]
# [(1, 5), (5, 1)]
59
tito

evalを使用できます。最短になると思います。

_>>> s = '(1,2,3,4,5),(5,4,3,2,1)'
>>> ts = eval(s)
>>> ts
((1, 2, 3, 4, 5), (5, 4, 3, 2, 1))
>>> tsp = [(el[0],el[-1]) for el in ts]
>>> tsp
[(1, 5), (5, 1)]
_

それでも、evalを使用するのは良い方法ではありませんです。

別のオプションは、reモジュールを使用して文字列を解析することです。

_>>> a = re.findall('\([^)]*\)',s)
>>> a
['(1,2,3,4,5)', '(5,4,3,2,1)']
_

正規表現パターンはこれを意味します:

_\( #opening parenthesis
[^)]* #from 0 to infinite symbols different from )
\) #closing parenthesis
_

_>>> b = [el.strip('()') for el in a]
>>> b
['1,2,3,4,5', '5,4,3,2,1']
>>> c = [el.split(',') for el in b]
>>> c
[['1', '2', '3', '4', '5'], ['5', '4', '3', '2', '1']]
>>> d = [Tuple(int(el2) for el2 in el) for el in c]
>>> d
[(1, 2, 3, 4, 5), (5, 4, 3, 2, 1)]
_

また、次のこともできます。

_>>> [Tuple(int(i) for i in el.strip('()').split(',')) for el in s.split('),(')]
[(1, 2, 3, 4, 5), (5, 4, 3, 2, 1)]
_

このアプローチでは、モジュールをまったく使用しません。ただし、あまり堅牢ではありません(入力文字列に不一致がある場合、たとえば、括弧とコンマ...), (...の間にスペースがある場合、注釈は機能します)。

21
ovgolovin

この場合、astモジュールが便利です。

>>> from ast import literal_eval
>>> s = '(1,2,3,4,5),(5,4,3,2,1)'
>>> my_tuples = literal_eval(s)
>>> my_tuples
((1, 2, 3, 4, 5), (5, 4, 3, 2, 1))

そう、 my_tuplesには、文字列のタプルを含むタプルがあります。これで、リスト内包表記を使用して、すべてのタプルの最初と最後の要素を取得できます。

>> new_tuples = [(t[0], t[-1]) for t in my_tuples]
>>> new_tuples
[(1, 5), (5, 1)]
5
juliomalegria