我的实际例子比较复杂,所以我将这个概念简化为一个简单的例子:
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,...]
有几种选择......
使用列表理解,如果足够短:
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)
这是在不直接进入列表推导式的情况下执行此操作的方法。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)
| 归档时间: |
|
| 查看次数: |
9121 次 |
| 最近记录: |