【问题标题】:python dictionary assignment using map and lambda使用map和lambda的python字典分配
【发布时间】:2016-06-27 09:56:46
【问题描述】:

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

然后创建一个字典,其中第一个单词为 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

感谢两位展示这个:)

【问题讨论】:

    标签: python dictionary lambda


    【解决方案1】:

    使用dict comprehension 比使用map 更好。

    可以这样做:

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

    一些注意事项和改进:

    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)

    【讨论】:

    • 为什么在这里使用str.find - 如果您只想检查包含而不打算使用索引,if not 'XYZ' in line 更符合pythonic...
    • 感谢您的意见,这太棒了。
    【解决方案2】:

    使用 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)}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      相关资源
      最近更新 更多