我的意见是:
input = ['(var1, )', '(var2,var3)']
Run Code Online (Sandbox Code Playgroud)
预期产出是:
output = [('var1', ), ('var2','var3')]
Run Code Online (Sandbox Code Playgroud)
迭代输入并在元组字符串上使用eval/ literal_eval是不可能的:
>>> eval('(var1, )')
>>> NameError: name 'var1' is not defined
Run Code Online (Sandbox Code Playgroud)
如何将项目转换为'(var1, )'元组,其中内部对象被视为字符串而不是变量?
有没有比编写解析器或使用正则表达式更简单的方法?
vau*_*tah 12
对于每次出现的变量,eval在符号表中搜索变量的名称.可以提供自定义映射,该映射将返回每个缺失键的键名:
class FakeNamespace(dict):
def __missing__(self, key):
return key
Run Code Online (Sandbox Code Playgroud)
例:
In [38]: eval('(var1,)', FakeNamespace())
Out[38]: ('var1',)
In [39]: eval('(var2, var3)', FakeNamespace())
Out[39]: ('var2', 'var3')
Run Code Online (Sandbox Code Playgroud)
注意: 如果没有,则将eval当前全局变量复制到提交的globals字典中__builtins__.这意味着表达式可以访问内置函数,异常和常量,以及命名空间中的变量.您可以尝试通过传递来解决这个问题FakeNamespace(__builtins__=<None or some other value>)而不仅仅是FakeNamespace(),但它不会eval100%安全( Python eval:如果我禁用内置和属性访问,它仍然是危险的吗?)
试试这个:
tuples = [tuple(filter(None, t.strip('()').strip().split(','))) for t in input]
Run Code Online (Sandbox Code Playgroud)
例如:
In [16]: tuples = [tuple(filter(None, t.strip('()').strip().split(','))) for t in input]
In [17]: tuples
Out[17]: [('var1',), ('var2', 'var3')]
Run Code Online (Sandbox Code Playgroud)
我们遍历我们的元组字符串列表,并为每个字符串删除()s,然后将字符串拆分为列表,,然后将列表转换回元组.我们filter()用来删除空元素.
| 归档时间: |
|
| 查看次数: |
472 次 |
| 最近记录: |