簡體   English   中英

將字符串轉換為元組

[英]converting string to tuple

我需要編寫一個接受字符串'(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]))

但在這里我被卡住了。

您可以使用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)]

您可以使用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)]

這種方法根本不需要模塊。 但這不是很健壯(如果輸入字符串會有一些不一致的地方,例如括號和逗號之間的空格...), (... ,那么注釋會起作用)。

在這種情況下, 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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM