【问题标题】:converting string to tuple将字符串转换为元组
【发布时间】:2012-01-19 15:20:29
【问题描述】:

我需要编写一个函数,它接受一个字符串 '(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]))

但我在这里卡住了..

【问题讨论】:

  • 想得更像 re.findall() 或 eval() (但请记住,eval 是邪恶的)。抱歉,没有时间给出完整的答案。
  • 你能修复代码格式吗? (由于某种原因,我不能……)
  • 相关:link

标签: python string tuples


【解决方案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)]

这种方法根本不需要模块。但它不是很健壮(如果输入字符串会有一些不一致,例如括号和逗号之间的空格...), (...,那么注释会起作用)。

【讨论】:

  • 是的,我知道.. 所以我想避免 eval.. 我真的不知道 re.findall,所以我也想避免那个,如果可能的话?
  • 有没有办法将 b、c 和 d 列表理解合并为一个列表理解?
  • @BelowtheRadar 当然[tuple(int(el2) for el2 in el.strip('()').split(',')) for el in a].
【解决方案2】:

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

【讨论】:

  • 注意,AST是python2.6+,我的python2.5项目必须使用eval。
【解决方案3】:

在这种情况下,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)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2016-03-14
    • 2017-06-27
    • 2013-11-07
    相关资源
    最近更新 更多