Python从单个列表推导中创建集合/字典/列表及其值的总和



我想知道是否需要两个列表推导来返回集合/字典/列表的有序对以及集合/字典/列表中的值的总和。以下是我的意思的一个例子:

>>> l = ['abc', 'd', 'efgh', 'ij']
>>> {i: len(i) for i in l}, sum(len(i) for i in l)
({'efgh': 4, 'abc': 3, 'ij': 2, 'd': 1}, 10)

有没有比重复for i in l理解更好/更pythonic的方式来编写这个?

更新:

我问这个问题是因为我正在考虑写一个特定lambda的最佳方式;即

>>> l = ['abc', 'd', 'efgh', 'ij']
>>> dict_value = lambda l: ({i: len(i) for i in l}, sum(len(i) for i in l))
>>> dict_value(l)
({'efgh': 4, 'abc': 3, 'ij': 2, 'd': 1}, 10)

我问这个问题是因为我不是用len()来计算我想要的值,而是一个昂贵的计算。下面关于 for 循环的观点确实解决了这个问题,如果我定义一个辅助方法而不是一个 lambda 来做工作。

您可以预先计算长度。我认为看起来更干净:

>>> l = ['abc', 'd', 'efgh', 'ij']
>>> llen = [len(i) for i in l]
>>> dict(zip(l,llen)), sum(llen)
({'abc': 3, 'd': 1, 'efgh': 4, 'ij': 2}, 10)

是的,或者你只使用常规循环:

d, s = {}, 0
for i in l:
    d[i] = len(i)
    s += len(i)

应该使用列表或集合或字典理解来创建一个对象;避免尝试创建副作用。并且不要低估常规循环的效用!

另外,不要犹豫,使用函数而不是lambda:

def as_dict_and_total(l):
    d, s = {}, 0
    for i in l:
        d[i] = len(i)
        s += len(i)
    return d, s

最新更新