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 |
或者别的什么?
你的意思是从
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) |
在处理指数时不要使用
在使用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)) |