Python-如何在循环中从变量生成新列表?

big*_*Cow 2 python

我的实际例子比较复杂,所以我将这个概念简化为一个简单的例子:

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

for number in l:
    calc = number*10
    print calc
Run Code Online (Sandbox Code Playgroud)

对于我的循环的每次迭代,我最终得到一个变量(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
Run Code Online (Sandbox Code Playgroud)

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

Tad*_*eck 7

有几种选择......

列表理解

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

new_list = [number * 10 for number in old_list]
Run Code Online (Sandbox Code Playgroud)

map()

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

def my_func(value):
    return value * 10

new_list = map(my_func, old_list)
Run Code Online (Sandbox Code Playgroud)

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

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

或者你可以使用简单的循环 - 它仍然有效和Pythonic:

new_list = []

for item in old_list:
    new_list.append(item * 10)
Run Code Online (Sandbox Code Playgroud)

发电机

有时,如果你有很多处理(正如你所说的那样),你想要在需要时懒洋洋地执行它,或者只是结果可能太大,你可能希望使用生成器.生成器记住生成下一个元素的方法并忘记之前发生的事情(我正在简化),因此您可以迭代它们一次(但您也可以显式创建例如存储所有结果的列表).

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

def process_list(old_list):
    for item in old_list:
        new_item = ...  # lots of processing - item into new_item
        yield new_item
Run Code Online (Sandbox Code Playgroud)

然后打印出来:

for new_item in process_list(old_list):
    print(new_item)
Run Code Online (Sandbox Code Playgroud)

有关生成器的更多信息,请参阅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))
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 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)
Run Code Online (Sandbox Code Playgroud)

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

l2 = [ number*10 for number in l1 ]
Run Code Online (Sandbox Code Playgroud)