在Python3 Pythonic中使用map(…)(与循环相比)
我想转换元组的字符串表示形式列表,例如:在Python3 Pythonic中使用map(…)(与循环相比),python,python-3.x,Python,Python 3.x,我想转换元组的字符串表示形式列表,例如: ["(279, 256000, '.m4a')", "(217, 256000, '.m4a')", "(174, 128000, '.mp3')"] [(279, 256000, '.m4a'), (217, 256000, '.m4a'), (174, 128000, '.mp3')] 进入元组列表,例如: ["(279, 256000, '.m4a')", "(217, 256000, '.m4a')", "(174, 128000, '.mp
["(279, 256000, '.m4a')", "(217, 256000, '.m4a')", "(174, 128000, '.mp3')"]
[(279, 256000, '.m4a'), (217, 256000, '.m4a'), (174, 128000, '.mp3')]
进入元组列表,例如:
["(279, 256000, '.m4a')", "(217, 256000, '.m4a')", "(174, 128000, '.mp3')"]
[(279, 256000, '.m4a'), (217, 256000, '.m4a'), (174, 128000, '.mp3')]
这似乎是最简洁(和清晰)的方法
recs = ... # loaded from text file
data = map(eval, recs)
然而,我看到一个帖子
这似乎意味着map()可能不是好的python,或者可能会被弃用
另一种选择似乎更详细(因此稍微不那么清楚):
哪一个更像python?
map
与命名函数一起使用时可以;当您将它与内联lambda一起使用时,列表理解或生成器表达式将变得更清晰<另一方面,代码>评估,并不是很好。考虑一下。
另外,map
返回一个iterable(在Python 3中);如果你想要一个列表,你必须在结果上调用list
data = list(map(ast.literal_eval, recs))
map
与命名函数一起使用时很好;当您将它与内联lambda一起使用时,列表理解或生成器表达式将变得更清晰<另一方面,代码>评估,并不是很好。考虑一下。
另外,map
返回一个iterable(在Python 3中);如果你想要一个列表,你必须在结果上调用list
data = list(map(ast.literal_eval, recs))
在我看来,使用
map
是一个很好的功能性解决方案,但由于添加了生成器,因此可以将其视为一种冗余的语言功能。另一方面,迭代数组并连接到列表的示例不是Pythonic的
map
的一些Pythonic替代方案:
# a list comprehesion
[ast.literal_eval(r) for r in recs]
或
或
别忘了导入ast
编辑:正如@minitech所指出的,您应该使用
ast.literal\u eval
而不是eval
,在我看来,使用map
是一个很好的功能解决方案,但自从添加了生成器后,它可以被视为一个冗余的语言功能。另一方面,迭代数组并连接到列表的示例不是Pythonic的
map
的一些Pythonic替代方案:
# a list comprehesion
[ast.literal_eval(r) for r in recs]
或
或
别忘了导入ast
编辑:正如@minitech指出的,您应该使用
ast.literal\u eval
而不是eval请原谅我的无知(对Python来说相当陌生),但是为什么eval“不是很好”?作为我的新身份的证明,我还没有遇到ast-我会查一下,谢谢你的提示。。。我怀疑循环不是“pythonic”,感谢您的选择。@RFlack:eval
可以执行任意代码,因此在用户输入时使用它不安全。即使你认为这不适用于你的情况,相关的安全漏洞也有潜入的习惯,所以如果可能的话,最好使用更严格的等价物。啊,这是有道理的。在这种情况下,数据是由(我的)程序“安全”写入的,而不是用户输入。但我同意你的观点。谢谢。请原谅我的无知(对Python来说相当陌生),但是为什么eval“不是很好”?作为我的新身份的证明,我还没有遇到ast-我会查一下,谢谢你的提示。。。我怀疑循环不是“pythonic”,感谢您的选择。@RFlack:eval
可以执行任意代码,因此在用户输入时使用它不安全。即使你认为这不适用于你的情况,相关的安全漏洞也有潜入的习惯,所以如果可能的话,最好使用更严格的等价物。啊,这是有道理的。在这种情况下,数据是由(我的)程序“安全”写入的,而不是用户输入。但我同意你的观点。谢谢