我只是想知道以下循环是否可以使用map()而不是使用for循环? 如果是,请善待展示如何? 要么 什么是最有效的方法?
f = open('sample_list.txt').read().split('\n')
val = lambda x: re.match('[a-zA-z0-9]+',x).group() if x else None
for line in f:
if line.find('XYZ') == -1:
dict[val(line)]=0
else:
dict[val(line)]=1
此程序读取格式为:
的文件ABCD XYZ
DEFG ABC
然后创建一个dicionary,第一个单词为KEY,如果是第二个值 是XYZ然后它将赋值1否则为0。
即dict将是:
{'ABCD': 1, 'DEFG': 0}
更新:
我计划了 @ shx2 和 @arekolek 建议的方法 字典理解更快, @ arekolek 方法比任何方法都快,因为它没有使用我声明的val()lambda函数。
代码:
def a():
return {
val(line) : 0 if line.find('XYZ') == -1 else 1
for line in f
}
def b():
return dict(map(lambda x: (x[0], int(x[1] == 'XYZ')), map(str.split, f)))
def c():
return {k: int(v == 'XYZ') for k, v in map(str.split, f)}
print 'a='+timeit.timeit(a)
print 'b='+timeit.timeit(b)
print 'c='+timeit.timeit(c)
结果:
a = 13.7737597283
b = 6.82668938135
c = 3.98859187269
感谢两位表示:)
答案 0 :(得分:4)
最好使用dict comprehension而不是map
。
可以这样做:
my_dict = {
val(line) : 0 if line.find('XYZ') == -1 else 1
for line in f
}
一些注意事项和改进:
dict
在python 0 if line.find('XYZ') == -1 else 1
的替代方法:
int(line.find('XYZ') != -1)
(将bool
转换为int
)bool
s:line.find('XYZ') != -1
'XYZ' in line
(来自:@JonClements)答案 1 :(得分:1)
使用lambda:
dict(map(lambda x: (x[0], int(x[1] == 'XYZ')), map(str.split, f)))
或者:
dict(map(lambda k, v: (k, int(v == 'XYZ')), *map(str.split, f)))
字典理解:
{k: int(v == 'XYZ') for k, v in map(str.split, f)}