关于python:有没有一种方法可以将列表理解重写为for循环?

Is there a way to rewrite a list comprehension as a for loop?

我有一行这样的代码:

1
list1=[string1[i:i+int1] for i in range(0, len(string1), int1)]

我记得我的老师说我们应该在有"for"的时候开始新的一行。那么,有没有一种方法可以编写这样的代码:

1
2
for i in range(0, len(string1), int1):
    #something here

或者别的什么?


你的意思是从list-comprehension中提取一个无聊的老规则for loop

1
list1=[string1[i:i+int1] for i in range(0, len(string1), int1)]

变成:

1
2
3
list1 = list()
for i in range(0, len(string1), int1):
    list1.append(string1[i:i+int1])

如果您希望在迭代数据时添加异常处理、日志记录或更复杂的函数或行为,这将非常有用。

例如:

1
2
3
4
5
6
7
8
9
10
11
list1 = list()
for i in range(0, len(string1), int1):
    log.info('in loop: i={}'.format(i))
    try:
        data = string1[i:i+int1]
    except:
        log.error('oh no!')
        # maybe do something complex here to get some data anyway?
        data = complex_function(i)
    log.debug('appending to list: data={}'.format(data))
    list1.append(data)

但一般来说,清单理解是一种完全合法的书写方式。


您必须先创建空列表,然后为每个迭代附加。

1
2
3
list1 = []
for i in range(0, len(string1), int1):
    list1.append(string1[i:i+int1])


这种列表理解可以转化为:

1
2
3
l = []
for i in range(0, len(string1), int1):
    l.append(string1[i:i+int1])

1
2
g = (string[i:i+int1] for i,char in enumerate(string) if i % int1 == 0)
l = list(g)

在处理指数时不要使用len(iterable)。用enumerate()来做这个。它产生(index, item)。这是一种高效的脓毒气疗法。

在使用EDCOX1的5个循环时,你应该做一个换行的想法可能是其他语言,C,C++,而不是Python语言的习惯用法。列表理解来自于FP的haskell世界。所以他们来的时候很优雅。


有点脏,但对于将集合拆分为固定大小的子集合来说是一个不错的选择。

1
2
3
4
5
from itertools import zip_longest

l = []
for chunk in zip_longest(*([iter(string1)]*int1), fillvalue=''):
    l.append(''.join(chunk))