2

我的实际示例涉及更多,因此我将概念归结为一个简单的示例:

l = [1,2,3,4,5,6,7,8]

for number in l:
    calc = number*10
    print calc

对于循环的每次迭代,我都会得到一个变量 ( calc),我想用它来填充一个新列表。我的实际过程不仅仅是将值乘以10,因此我希望能够通过这种方法设置新列表中的每个值。新代码可能如下所示:

l = [1,2,3,4,5,6,7,8]

for number in l:
    calc = number*10
    # set calc as x'th entry in a new list called l2 (x = iteration cycle)

print l2

然后它将打印新列表:[10,20,30,40,...]

4

7 回答 7

10

有几种选择...

列表推导

如果足够短,请使用列表理解

new_list = [number * 10 for number in old_list]

map()

map()如果该函数之前存在(或者您将例如使用),您也可以使用lambda

def my_func(value):
    return value * 10

new_list = map(my_func, old_list)

请注意,在 Python 3.xmap()中不返回列表(因此您需要执行以下操作:)new_list = list(map(my_func, old_list))

for ... in使用简单循环填充其他列表

或者,您可以使用简单的循环 - 它仍然有效且 Pythonic:

new_list = []

for item in old_list:
    new_list.append(item * 10)

发电机

有时,如果您有很多处理(如您所说),您想在请求时懒惰地执行它,或者结果可能太大,您可能希望使用生成器。生成器记住生成下一个元素的方式并忘记之前发生的任何事情(我正在简化),因此您可以遍历它们一次(但您也可以显式创建例如存储所有结果的列表)。

在您的情况下,如果这仅用于打印,您可以使用:

def process_list(old_list):
    for item in old_list:
        new_item = ...  # lots of processing - item into new_item
        yield new_item

然后打印它:

for new_item in process_list(old_list):
    print(new_item)

有关生成器的更多信息,您可以在 Python 的 wiki 中找到:http ://wiki.python.org/moin/Generators

访问“迭代次数”

但是,如果您的问题更多关于如何检索迭代次数,请查看enumerate()

for index, item in enumerate(old_list):
    print('Item at index %r is %r' % (index, item))
于 2013-06-03T01:20:42.530 回答
7

以下是如何在不直接跳入列表推导的情况下做到这一点。用作变量名不是一个好主意,l因为它与1某些字体中的相同,所以我更改了它(虽然l1并没有更好:))

l1 = [1,2,3,4,5,6,7,8]
l2 = []
for number in l1:
    calc = number*10
    print calc
    l2.append(calc)

列表推导确实提供了一种更紧凑的方式来编写这种模式

l2 = [ number*10 for number in l1 ]
于 2013-06-03T01:23:28.350 回答
3

使用列表理解

>>> l = [1,2,3,4,5,6,7,8]
>>> l2 = [ item*10 for item in l]
>>> l2
[10, 20, 30, 40, 50, 60, 70, 80]

这大致相当于,但列表推导比普通的 for 循环更快:

>>> l2 = []
>>> for number in l:
...     calc = number * 10  #do some more calculations
...     l2.append(calc)     #appends the final calculated value at the end of l2
...     
>>> l2
[10, 20, 30, 40, 50, 60, 70, 80]

您还可以为您正在执行的所有计算创建一个函数,然后在列表推导中调用该函数:

def solve(x):
   #do some calculations here
   return calculated_value

l2 = [ solve(item) for item in l]
于 2013-06-03T01:20:36.357 回答
0

其他人都给了你正确的答案:使用列表推导。

我会给你一个替代的正确答案:使用带有 lambda 或函数的 map。

当“函数”非常简单时,您可以使用 lambda:

print map(lambda x: x*10,[1,2,3,4,5,6,7,8])
# [10, 20, 30, 40, 50, 60, 70, 80]

map 使用的函数可以是任意复杂的,然后使用函数更容易:

def more_complex(x):
    # can be as complex as a function can be
    # for now -- *10
    return x*10

print map(more_complex,[1,2,3,4,5,6,7,8])

但这也适用于理解:

l2=[more_complex(x) for x in [1,2,3,4,5,6,7,8]]

只是为了让您熟悉地图与列表理解的形式。

于 2013-06-03T01:36:02.103 回答
0

所以我相信你想对列表的每个元素应用一个函数。

您是否尝试过列表理解?

[num*10 for num in l]

应该为您提供这个简单示例所需的内容。

自然,如果您有一些更复杂的操作集,您可以使用之前定义的函数,即:

def explode(n):
    return (n + (n * n) - (3 * n))

[explode(num) for num in l]
于 2013-06-03T01:24:08.873 回答
0

您的问题的一个简单答案是附加calc到一个列表,如下所示:

l = [1,2,3,4,5,6,7,8]

your_list = []
for number in l:
    calc = number*10
    your_list.append(calc)

要访问列表中的变量,请使用切片语法。

即,列表中的第二个元素将是your_list[1], the 5th your_list[4]

我怀疑您需要在某个时候清空列表。要使用切片进行此操作,请使用calc[:] = []

于 2013-06-03T01:25:41.193 回答
0

生成列表的循环

KOT = []
l = [1,2,3,4,5,6,7,8]


for number in l:
    calc = number*10
    KOT.append(calc)

你得到了 KOT 名单

KOT = [10, 20, 30, 40, 50, 60, 70, 80]
于 2021-04-02T18:03:00.653 回答