将字符串转换为元组
Posted
tags:
篇首语:本文由小常识网(cha138.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]))
在这里买我卡住..
答案
你可以使用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)]
另一答案
你可以使用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)']
Regexp模式意味着:
( #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)]
以上是关于将字符串转换为元组的主要内容,如果未能解决你的问题,请参考以下文章