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

时间:2013-06-03 01:18:23

标签: python

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

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,...]

7 个答案:

答案 0 :(得分:6)

有几种选择......

列表理解

如果足够短,请使用list comprehension

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.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)

发电机

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

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

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))

答案 1 :(得分:4)

这是如何在不直接跳到列表推导的情况下完成的。使用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 ]

答案 2 :(得分:2)

使用list comprehension

>>> 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]

大致相当于,但是列表理解比正常的循环更快:

>>> 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]

答案 3 :(得分:0)

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

您是否尝试过列表理解?

[num*10 for num in l]

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

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

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

[explode(num) for num in l]

答案 4 :(得分: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],第五个your_list[4]

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

答案 5 :(得分:0)

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

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

当'function'非常简单时,你可以使用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]]

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

答案 6 :(得分: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]