使用map和lambda的python字典分配

CYA*_*EVI 4 python lambda dictionary

我只是想知道以下循环是否可以通过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
Run Code Online (Sandbox Code Playgroud)

该程序读取以下格式的文件:

ABCD XYZ 
DEFG ABC
Run Code Online (Sandbox Code Playgroud)

然后创建一个带有第一个单词作为KEY的字典,如果第二个值为XYZ,则它将分配一个值为1的值,否则为0。

即字典将是:

{'ABCD': 1, 'DEFG': 0}
Run Code Online (Sandbox Code Playgroud)

更新:

我对@ 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)
Run Code Online (Sandbox Code Playgroud)

结果:

a = 13.7737597283
b = 6.82668938135
c = 3.98859187269
Run Code Online (Sandbox Code Playgroud)

谢谢你们都展示了这个:)

shx*_*hx2 5

比起使用dict理解更好map。

可以这样做:

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

一些注意事项和改进:

  1. dict 在python中不是一个好的变量名
  2. 复杂表达的替代方法0 if line.find('XYZ') == -1 else 1:
    • int(line.find('XYZ') != -1)(转换bool为int)
    • 如果可以将值保留为bools:line.find('XYZ') != -1
    • 'XYZ' in line (来源:@JonClements)


are*_*lek 1

使用 lambda:

dict(map(lambda x: (x[0], int(x[1] == 'XYZ')), map(str.split, f)))
Run Code Online (Sandbox Code Playgroud)

或者:

dict(map(lambda k, v: (k, int(v == 'XYZ')), *map(str.split, f)))
Run Code Online (Sandbox Code Playgroud)

字典理解:

{k: int(v == 'XYZ') for k, v in map(str.split, f)}
Run Code Online (Sandbox Code Playgroud)