python 3 map/lambda method with 2 inputs

2019-03-18 16:26发布

I have a dictionary like the following in python 3:

ss = {'a':'2', 'b','3'}

I want to convert all he values to int using map function, and I wrote something like this:

list(map(lambda key,val: int(val), ss.items())))

but the python complains:

TypeError: () missing 1 required positional argument: 'val'

My question is how can I write a lambda function with two inputs (E.g. key and val)

1条回答
再贱就再见
2楼-- · 2019-03-18 16:37

ss.items() will give an iterable, which gives tuples on every iteration. In your lambda function, you have defined it to accept two parameters, but the tuple will be treated as a single argument. So there is no value to be passed to the second parameter.

  1. You can fix it like this

    print(list(map(lambda args: int(args[1]), ss.items())))
    # [3, 2]
    
  2. If you are ignoring the keys anyway, simply use ss.values() like this

    print(list(map(int, ss.values())))
    # [3, 2]
    
  3. Otherwise, as suggested by Ashwini Chaudhary, using itertools.starmap,

    from itertools import starmap
    print(list(starmap(lambda key, value: int(value), ss.items())))
    # [3, 2]
    
  4. I would prefer the List comprehension way

    print([int(value) for value in ss.values()])
    # [3, 2]
    

In Python 2.x, you could have done that like this

print map(lambda (key, value): int(value), ss.items())

This feature is called Tuple parameter unpacking. But this is removed in Python 3.x. Read more about it in PEP-3113

查看更多
登录 后发表回答