在Python 3 Pythonic中使用map(...)(与循环相比)

RFl*_*ack 1 python python-3.x

我想转换元组的字符串表示列表,例如:

["(279, 256000, '.m4a')", "(217, 256000, '.m4a')", "(174, 128000, '.mp3')"]
Run Code Online (Sandbox Code Playgroud)

进入元组列表,例如:

[(279, 256000, '.m4a'), (217, 256000, '.m4a'), (174, 128000, '.mp3')]
Run Code Online (Sandbox Code Playgroud)

这似乎是最简洁(最清晰)的方法

recs = ... # loaded from text file
data  = map(eval, recs)  
Run Code Online (Sandbox Code Playgroud)

但是,我看过一个发布Python课程 - lambda 似乎暗示map()可能不是很好的python或可能会被弃用.

替代方案似乎更像是冗长的(因此稍微不那么清晰):

data = []
for r in recs:
    data += [eval(r)]
Run Code Online (Sandbox Code Playgroud)

哪个更pythonic?

Ry-*_*Ry- 8

map与命名函数一起使用时很好; 当你使用内联lambda时,列表理解或生成器表达式变得更清晰.eval另一方面,并​​不是很好.考虑一下ast.literal_eval.

import ast

data = map(ast.literal_eval, recs)
Run Code Online (Sandbox Code Playgroud)

另外,map返回一个iterable(在Python 3中); 如果你想要一个列表,你将不得不调用list结果.

data = list(map(ast.literal_eval, recs))
Run Code Online (Sandbox Code Playgroud)