嵌套Python列表推导式构造列表的列表
我刚开始学Python,遇到了嵌套列表推导式的问题,感觉有点难理解。我想写一段代码,读取一个文件,然后为每一行的每个字符构建一个列表。
比如,如果文件内容是:
xxxcd
cdcdjkhjasld
asdasdxasda
那么生成的列表应该是:
[
['x','x','x','c','d']
['c','d','c','d','j','k','h','j','a','s','l','d']
['a','s','d','a','s','d','x','a','s','d','a']
]
我写了下面这段代码,它能正常工作,但我总觉得我应该能用嵌套列表推导式把它写得更简洁一些。如果有建议的话,我会很感激。
data = []
f = open(file,'r')
for line in f:
line = line.strip().upper()
list = []
for c in line:
list.append(c)
data.append(list)
7 个回答
这里展示了一种列表推导的用法。
data = []
f = open(file,'r')
for line in f:
data.append([ch for ch in line.strip().upper()])
但我们可以一次性完成整个操作:
f = open(file, 'rt')
data = [list(line.strip().upper()) for line in f]
这里使用了 list()
函数,把一个字符串转换成一个单字符字符串的列表。我们也可以使用嵌套的列表推导,并把 open()
函数放在里面:
data = [[ch for ch in line.strip().upper()] for line in open(file, 'rt')]
不过到这个时候,我觉得列表推导让代码变得不太容易理解了。
对于复杂的处理,比如列表里面还有列表的情况,你可能会想在外层使用 for
循环,而在内层使用列表推导。
另外,正如 Chris Lutz 在评论中提到的,这种情况下其实没有必要把每一行都拆分成字符列表;你可以把字符串当作列表来处理,并且可以用字符串的方法来操作字符串,但不能用字符串的方法来操作列表。(当然,你可以用 ''.join()
把列表重新合并成字符串,但为什么不直接保留它作为字符串呢?)
在你的情况下,你可以用 list
这个构造函数来处理里面的循环,然后用列表推导式来处理外面的循环。可以这样写:
f = open(file)
data = [list(line.strip().upper()) for line in f]
假设你有一个字符串作为输入,使用这个列表构造函数会创建一个列表,列表中的每个元素都是字符串里的一个字符。
而列表推导式的功能和下面这个是一样的:
data = []
for line in f:
data.append(list(line.strip().upper()))
这段话的意思是,这个方法应该能帮到你(你可能需要自己动手调整一下,去掉换行符或者按照你想要的格式来处理,但基本的思路是可行的):
f = open(r"temp.txt")
[[c for c in line] for line in f]