Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python3 Pythonic中使用map(…)(与循环相比)_Python_Python 3.x - Fatal编程技术网

在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
可以执行任意代码,因此在用户输入时使用它不安全。即使你认为这不适用于你的情况,相关的安全漏洞也有潜入的习惯,所以如果可能的话,最好使用更严格的等价物。啊,这是有道理的。在这种情况下,数据是由(我的)程序“安全”写入的,而不是用户输入。但我同意你的观点。谢谢