tit*_*ito 61
你可以使用ast.literal_eval():
安全地评估表达式节点或包含Python表达式的字符串.提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None.
这可以用于安全地评估包含来自不可信来源的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)]
Run Code Online (Sandbox Code Playgroud)
ovg*_*vin 22
你可以用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)]
Run Code Online (Sandbox Code Playgroud)
不过,这是不是一个好的做法用eval.
另一种选择是使用re模块解析字符串.
>>> a = re.findall('\([^)]*\)',s)
>>> a
['(1,2,3,4,5)', '(5,4,3,2,1)']
Run Code Online (Sandbox Code Playgroud)
Regexp模式意味着:
\( #opening parenthesis
[^)]* #from 0 to infinite symbols different from )
\) #closing parenthesis
Run Code Online (Sandbox Code Playgroud)
.
>>> 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)]
Run Code Online (Sandbox Code Playgroud)
此外,您可以执行以下操作:
>>> [tuple(int(i) for i in el.strip('()').split(',')) for el in s.split('),(')]
[(1, 2, 3, 4, 5), (5, 4, 3, 2, 1)]
Run Code Online (Sandbox Code Playgroud)
这种方法根本不需要模块.但它不是很健壮(如果输入字符串会有一些不一致,例如括号和逗号之间的空格...), (...,那么注意会起作用).
在这种情况下,该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))
Run Code Online (Sandbox Code Playgroud)
所以,my_tuples有一个元组与元组的元组.现在,我们可以使用列表推导来获取所有元组的第一个和最后一个元素:
>> new_tuples = [(t[0], t[-1]) for t in my_tuples]
>>> new_tuples
[(1, 5), (5, 1)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
53574 次 |
| 最近记录: |