我想知道是否需要两个列表推导来返回set / dict / list的有序对以及set / dict / list中值的总和。这是我的意思的一个例子:
>>> 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)
有没有更好/更pythonic的方式来写这个比重复for i in l
理解?
更新:
我问了这个问题,因为我在考虑编写特定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()
来计算我想要的值,而是一个昂贵的计算。如果我定义一个辅助方法而不是lambda来完成工作,那么下面关于for循环的问题确实解决了这个问题。
答案 0 :(得分:3)
您可以预先计算长度。我认为看起来更清晰:
>>> 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)
答案 1 :(得分:2)
是的,或者您只是使用常规循环:
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