拆下';从python列表

拆下';从python列表,python,list,Python,List,我有一个列表,在python中如下所示: ex = ['(1..3),(5..8)'] 我需要这样列出清单: [(1, 3), (5, 8)] 我试着使用replace函数,但只能得到 ['(1,3)、(5,8)]并且不能丢失'标记 希望有人能帮助我 谢谢如果您的格式是固定的,那么应该可以: >>> n = list(eval(ex[0].replace("..",","))) >>> n [(1, 3), (5, 8)] 更新: 使用文字评

我有一个列表,在python中如下所示:

ex = ['(1..3),(5..8)']
我需要这样列出清单:

[(1, 3), (5, 8)]
我试着使用replace函数,但只能得到
['(1,3)、(5,8)]
并且不能丢失
'
标记

希望有人能帮助我


谢谢

如果您的格式是固定的,那么应该可以:

  >>> n = list(eval(ex[0].replace("..",",")))
  >>> n
  [(1, 3), (5, 8)]
更新: 使用文字评估(更安全):

看起来像是个任务


这比我想象的更难看:

In [26]: ex = ['(1..22),(3..44)']

In [27]: [tuple([int(i) for i in s.strip('()').split('..')])
          for s in ex[0].split(',')]
Out[27]: [(1, 22), (3, 44)]
ast.literal\u eval
是安全的<代码>评估不可用

关于您的最新问题:

ex2 = ['(2..5)', '(7..10)']
[ast.literal_eval(a.replace('..', ',')) for a in ex2]
# returns [(2, 5), (7, 10)]

您正在尝试将该字符串转换为元组列表还是另一个字符串表示形式?您正在尝试将字符串更改为某些元组。替换字符串内容不能做到这一点。尝试类似于
eval
的方法。如果可能的话,最好不要直接使用eval,文本的另一种选择是来自ast的literal\u eval,如果ex只有一个元素,这也不起作用。为了将来的参考(到OP),请始终记住
eval
一个用户可以以任何方式操作的字符串是不安全的。您可以使用安全
eval
。编辑:@Doboy:比我快@约翰多:谢谢你的改进。是的,你可以,我应该用literal_eval.Thx替换它,以便快速回答,这正是我要找的。现在是转折点。我的输入列表现在是这样的:ex2=['(2..5',(7..10')。那么,我不能像上面那样只使用ex[0],而必须同时使用这两个。您再次为我提供了一个漂亮的答案:)以确保我正确理解这一点:我现在是有一个元组列表,还是只有一个包含“(“and”)”的列表?我希望你明白我的意思。是否可以从创建的列表中仅取出数字2 fx?@X-Pender-
[(2,5)、(7,10)]
是一个整数元组列表。您可以访问其元素:
结果[0][1]==2
。只需启动
ipython
,将行粘贴到其中,然后自己试一试。+1因为这是一种通用方法,具有使输入字符串的形式显式的优点。使用此方法,解析错误也更显式。不过,我发现正则表达式的方法更为明确。谢谢。我同意,这个解决方案既粗糙又混乱,但我想它回答了这个问题。+1:每一对的形式都是明确的,非常清楚。但是,此解析不会对输入字符串施加太多约束,因此可能会让一些错误以静默方式传递(例如,
(1..3)xxx(5..8)12,3
,即使其格式不正确,也会被接受)。
In [26]: ex = ['(1..22),(3..44)']

In [27]: [tuple([int(i) for i in s.strip('()').split('..')])
          for s in ex[0].split(',')]
Out[27]: [(1, 22), (3, 44)]
import ast
ex = ['(1..3),(5..8)']
list(ast.literal_eval(ex[0].replace('..', ',')))
# returns [(1, 3), (5, 8)]
ex2 = ['(2..5)', '(7..10)']
[ast.literal_eval(a.replace('..', ',')) for a in ex2]
# returns [(2, 5), (7, 10)]