Python:列表数据提取print内嵌循环及CSV多流派处理方案
嘿,我来帮你解决这两个Python问题哈:
问题1:Python中在print语句内运行循环提取列表数据的最优方案
其实在print里整合循环逻辑的最优方式,是用生成器表达式配合字符串拼接,毕竟反复调用print会频繁和系统做IO交互,效率偏低;而先把循环生成的内容拼成一个大字符串,再一次输出,能减少IO开销,性能更优。
举个实际例子,假设你有个电影列表:
movies = ["Inception", "Interstellar", "Dunkirk"]
如果要逐个打印每个电影的描述,最优写法是:
print('\n'.join(f"当前电影:{title}" for title in movies))
这里用生成器表达式(f"当前电影:{title}" for title in movies)生成每个要输出的字符串片段,再用'\n'.join()把它们拼接成一个包含换行的大字符串,最后一次调用print输出。既满足了在print语句内整合循环的需求,又保证了性能,数据量越大优势越明显。
问题2:处理CSV中的多流派数据,生成对应Genres.Add语句
先看你的代码,核心问题是line[2]是逗号分隔的多流派字符串,得先把它拆成单个流派,再逐个生成Add语句。另外你的字符串格式化写法有点绕,推荐用Python3.6+支持的f-string,可读性和维护性都更好。
修改后的完整代码如下:
import csv with open('Movie2.csv', 'r') as csv_file: csv_reader = csv.reader(csv_file) # 如果你的CSV文件有表头(比如第一行是ID、标题、流派这类字段名),记得先跳过 next(csv_reader) counter = 0 for line in csv_reader: counter += 1 # 先打印电影初始化语句 print(f'Movie m{counter} = new Movie();') # 拆分流派字符串,同时清理每个流派前后的空格 genres = [genre.strip() for genre in line[2].split(',')] # 遍历每个流派,生成对应的Add语句 for genre in genres: print(f'm{counter}.Genres.Add(db.Genres.FirstOrDefault(x => x.GenreName == "{genre}"));') # 打印空行分隔不同电影,让输出更清晰 print()
关键细节说明:
- 跳过表头:用
next(csv_reader)跳过第一行,避免把表头当成电影数据处理——如果你的CSV没有表头,可以删掉这一行。 - 清理流派名称:
line[2].split(',')会把"Horror, Thriller, Drama"拆成["Horror", " Thriller", " Drama"],再用genre.strip()去掉每个流派前后的空格,得到干净的流派列表。 - 灵活输出:这里我选择逐个打印Add语句,是因为可读性更好;如果追求极致性能,也可以像问题1那样,把所有Add语句拼成一个字符串再一次打印,比如:
add_lines = '\n'.join(f'm{counter}.Genres.Add(db.Genres.FirstOrDefault(x => x.GenreName == "{genre}"));' for genre in genres) print(add_lines)
另外,如果你的流派名称里可能包含双引号(比如"Sci-Fi, "Space Epic""),可以用repr(genre)来自动处理转义,把"{genre}"改成"{repr(genre)[1:-1]}"就行(repr()会给字符串加引号,所以要去掉首尾的引号)。
内容的提问来源于stack exchange,提问作者Jimmy Monreal
相关产品推荐
相关产品推荐

