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)
谢谢你们都展示了这个:)
比起使用dict理解更好map。
可以这样做:
my_dict = {
val(line) : 0 if line.find('XYZ') == -1 else 1
for line in f
}
Run Code Online (Sandbox Code Playgroud)
一些注意事项和改进:
dict 在python中不是一个好的变量名0 if line.find('XYZ') == -1 else 1:
int(line.find('XYZ') != -1)(转换bool为int)bools:line.find('XYZ') != -1'XYZ' in line (来源:@JonClements)使用 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)
| 归档时间: |
|
| 查看次数: |
2249 次 |
| 最近记录: |