如何将嵌套列表的所有元素相乘

时间:2012-07-01 07:17:58

标签: python python-2.7

我刚开始使用Python并需要一些帮助。我有以下包含列表的词典列表:

>>> series
[{'data': [2, 4, 6, 8], 'name': 'abc'}, {'data': [5, 6, 7, 8], 'name': 'efg'}]
>>> 

如何在不使用循环的情况下将内部列表的每个元素乘以常量并进行到位。

所以,如果我有:

>>> x = 100

代码应该导致:

>>> series
[{'data': [200, 400, 600, 800], 'name': 'abc'}, {'data': [500, 600, 700, 800], 'name': 'efg'}]

我能想出的最好的知识就是这个(我甚至不知道“[:]”是什么):

>>> for s in series:
...     s['data'][:] = [j*x for j in s['data']]
... 
>>> 

如何删除for循环?

对代码或指向docs的指针的解释也很不错。

谢谢!

3 个答案:

答案 0 :(得分:0)

  

如何删除for循环?

您可以使用list和dict comprehensions的组合删除循环:

>>> [{k:[j*100 for j in v] if k == 'data' else v for k,v in d.items()}
     for d in series]
[{'data': [200, 400, 600, 800], 'name': 'abc'}, {'data': [500, 600, 700, 800], 'name': 'efg'}]

然而,这种可读性较差,不再适用于乘法。

所以我认为你不应该尝试删除循环。你应该继续做你正在做的事情。

  

对代码或指向docs的指针的解释也很不错。

我认为解释上述代码没有多大意义,因为我们已经确定它不是您想要的。但也许您想知道[:]在现有代码中的作用。为此,我向您推荐这个相关的问题,详细解释了它:

答案 1 :(得分:0)

您可以使用for删除列表推导中的map循环:

for s in series:
    s['data'] = map(lambda d: d*x, s['data'])

答案 2 :(得分:0)

通过遍历列表中的每个元素来映射乘数:

series = [{'data': [2, 4, 6, 8], 'name': 'abc'}, {'data': [5, 6, 7, 8], 'name': 'efg'}]
x=100

def mult_elements(series, x):
    for s in series:
        s['data']= map(lambda y:y*x, s['data'])
    return series

print mult_elements(series, x)

将其作为包含列表理解的单行代码:

series = [{'data': map(lambda y:y*x, s['data']), 'name':s['name']} for s in series]