如何巧妙地将Python列表中的每个项目传递给函数并更新列表(或创建一个新列表)

时间:2015-07-03 16:50:30

标签: python list python-2.7 iteration sequence

鉴于floats 花费列表的列表,我想对每个项目应用round(),并使用舍入值更新列表,或者创建一个新的列表。

我正在设想使用列表理解来创建新列表(如果原始文件不能被覆盖),但是将每个项目传递给round()呢?

我发现序列解包here如此尝试:

round(*spendList,2)

得到了:

TypeError                                 Traceback (most recent call last)
<ipython-input-289-503a7651d08c> in <module>()
----> 1 round(*spendList)

TypeError: round() takes at most 2 arguments (56 given)

因此推测round试图围绕列表中的每个项目,我试过:

[i for i in round(*spendList[i],2)]

得到了:

In [293]: [i for i in round(*spendList[i],2)]
  File "<ipython-input-293-956fc86bcec0>", line 1
    [i for i in round(*spendList[i],2)]
SyntaxError: only named arguments may follow *expression

甚至可以在这里使用解包装序列?如果没有,怎么能实现呢?

3 个答案:

答案 0 :(得分:3)

您的list comprehension错误方法:

[i for i in round(*spendList[i],2)]

应该是:

[round(i, 2) for i in spendList]

您希望迭代spendList,并将round应用于其中的每个项目。这里不需要*“splat”)拆包;这通常只需要采用任意数量的位置参数的函数(并且,根据错误消息,round只需要两个)。

答案 1 :(得分:2)

您可以使用map()功能 -

>>> lst = [1.43223, 1.232 , 5.4343, 4.3233]
>>> lst1 = map(lambda x: round(x,2) , lst)
>>> lst1
[1.43, 1.23, 5.43, 4.32]

对于Python 3.x,您需要使用list(map(...)),如在Python 3.x map中返回迭代器而不是列表。

答案 2 :(得分:2)

你仍然可以使用你所说的列表理解,就这样:

list = [1.1234, 4.556567645, 6.756756756, 8.45345345]
new_list = [round(i, 2) for i in list]

new_list将是: [1.12,4.56,6.76,8.45]