相关疑难解决方法(0)

在lambda中自动元组解包的好等价python3是什么?

考虑以下python2代码

In [5]: points = [ (1,2), (2,3)]

In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
Run Code Online (Sandbox Code Playgroud)

这在python3中不受支持,我必须执行以下操作:

>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
Run Code Online (Sandbox Code Playgroud)

这非常难看.如果lambda是一个函数,我可以做

def some_name_to_think_of(p):
  x, y = p
  return x*x + y*y
Run Code Online (Sandbox Code Playgroud)

在python3中删除此功能会强制代码执行丑陋的方式(使用魔术索引)或创建不必要的函数(最令人烦恼的部分是为这些不必要的函数考虑好名称)

我认为该功能至少应该添加到lambdas中.有没有好的选择?


更新:我正在使用以下助手扩展答案中的想法

def star(f):
  return lambda args: f(*args)

min(points, key=star(lambda x,y: (x*x + y*y))
Run Code Online (Sandbox Code Playgroud)

Update2:更清洁版star

import functools

def star(f):
    @functools.wraps(f):
    def f_inner(args):
        return f(*args)
    return f_inner
Run Code Online (Sandbox Code Playgroud)

python python-3.x

79
推荐指数
4
解决办法
3万
查看次数

访问defaultdict工厂中的密钥

我想尝试做类似的事情:

from   collections import defaultdict
import hashlib

def factory():
    key = 'aaa'
    return { 'key-md5' : hashlib.md5('%s' % (key)).hexdigest() }

a = defaultdict(factory)
print a['aaa']
Run Code Online (Sandbox Code Playgroud)

(实际上,我之所以需要访问工厂中的密钥,不是为了计算md5,而是出于其他原因;这只是一个例子)

正如你所看到的,在工厂里我无法访问密钥:我只是强迫它,这没有任何意义.

是否可以以defaultdict我可以在工厂中访问密钥的方式使用?

python dictionary python-2.7 defaultdict

12
推荐指数
2
解决办法
2872
查看次数

pythonic方式处理DataError:类型无效的输入:'dict'。先转换为字节、字符串、整数或浮点数。?

redis 版本 3.4.1 必须使用 hash,不能使用 str 或其他数据类型数据:

{'_anno': {
    'ctp': 'list',
    'dt': [],
    'ml': 0,
    'na': 'apple',
    'pos': -1,
    'rel': '',
    'st_var': '',
    'tp': 'object'},
'_att': {'_cuser': 'apple card',
         '_last_editor': 'apple card',
         '_protext': 'authorize',
         '_status': 'normal',
         '_theme_id': 'apple card',
         '_view': '12'},
    }

Run Code Online (Sandbox Code Playgroud)

我的代码

pool = redis.ConnectionPool(host=host, port=port)
conn = redis.StrictRedis(connection_pool=pool)

conn.hmset("aaaaaa",data)
Run Code Online (Sandbox Code Playgroud)

引发错误

数据错误:类型无效的输入:'dict'。首先转换为字节、字符串、整数或浮点数。

现在代码

pool = redis.ConnectionPool(host=host, port=port)
conn = redis.StrictRedis(connection_pool=pool)
new_data={}
for key,value in data.items():
    new_data[key]=json.dumps(value)
conn.hmset("aaaaaa",new_data)
Run Code Online (Sandbox Code Playgroud)

有没有更pythonic的方式?

redis python-3.x redis-py

5
推荐指数
1
解决办法
5297
查看次数