在python3中使用map(..)(与循环相比)



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

["(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)  

然而,我看到了一个发布Python课程- lambda这似乎意味着map()可能不是好的python,或者可能被弃用。

另一种选择似乎是更冗长的(因此稍微不太清楚):

data = []
for r in recs:
    data += [eval(r)]

哪个更像蟒蛇?

map与命名函数一起使用是可以的;当您将它与内联lambda一起使用时,列表推导式或生成器表达式才会变得更清晰。另一方面,eval并不是很好。考虑ast.literal_eval

import ast
data = map(ast.literal_eval, recs)

同样,map返回一个可迭代对象(在Python 3中);如果你想要一个列表,你必须在结果上调用list

data = list(map(ast.literal_eval, recs))

在我看来,使用map是一个很好的功能性解决方案,但可以看作是一个冗余的语言特性,因为添加了生成器。另一方面,在数组上迭代并连接到列表的示例是而不是 python式的。

map的一些python替代:

# a list comprehesion
[ast.literal_eval(r) for r in recs]

# a generator expression
(ast.literal_eval(r) for r in recs)

# a generator function
def mapYourData(recs):
  for r in recs:
    yield ast.literal_eval(r)

别忘了import ast

编辑:正如@minitech指出的,你应该使用ast.literal_eval而不是eval

最新更新