使用map和lambda的python字典赋值

时间:2016-06-27 09:56:46

标签: python dictionary lambda

我只是想知道以下循环是否可以使用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

感谢两位表示:)

2 个答案:

答案 0 :(得分:4)

最好使用dict comprehension而不是map

可以这样做:

my_dict = {
    val(line) : 0 if line.find('XYZ') == -1 else 1
    for line in f
}

一些注意事项和改进:

  1. dict在python
  2. 中不是一个好的变量名
  3. 复杂表达式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)}