如何格式化SQLite查询返回的元组列表,添加排名与制表符分隔?
问题:格式化SQLite查询结果为带排名的制表符分隔格式
我使用SQLite从数据库查询数据,旨在统计并排名下载量Top10的专辑,目前已成功获取结果,该结果为元组列表,每个元组包含艺术家名称、专辑标题和下载量。我希望为这些元组添加1-10的排名,并用制表符分隔各字段,呈现为如下格式:
1 Artist name Album title Number of downloads
但始终无法修改默认的元组输出格式。我尝试过用zip函数添加排名,也通过列表推导拆分元素,但均未达到预期效果。
现有代码
import sqlite3 db = sqlite3.connect("C:\Users\marlo\Downloads\programs\chinook.db") cur = db.cursor() cur.execute("""SELECT artists.name, Title, COUNT(*) as count FROM invoice_items JOIN tracks ON invoice_items.TrackId = tracks.TrackId JOIN albums ON tracks.AlbumId = albums.AlbumId JOIN artists ON albums.ArtistId = artists.ArtistID GROUP BY Title ORDER BY count DESC LIMIT 10""") Album_ranking = cur.fetchall() print(*Album_ranking, sep = "\n")
当前输出
('Chico Buarque', 'Minha Historia', 27) ('Lenny Kravitz', 'Greatest Hits', 26) ('Eric Clapton', 'Unplugged', 25) ('Titãs', 'Acústico', 22) ('Kiss', 'Greatest Kiss', 20) ('Caetano Veloso', 'Prenda Minha', 19) ('The Who', 'My Generation - The Very Best Of The Who', 19) ('Creedence Clearwater Revival', 'Chronicle, Vol. 2', 19) ('Green Day', 'International Superhits', 18) ('Creedence Clearwater Revival', 'Chronicle, Vol. 1', 18)
我还尝试过如下列表推导代码,但仅拆分了元素,未实现排版:
# formatting Rank = [*range(1, 11, 1)] Artist = [ranking[0] for ranking in Album_ranking] Album = [ranking[1] for ranking in Album_ranking] Frequency = [ranking[2] for ranking in Album_ranking]
作为编程新手,希望得到解决该格式化问题的方法。
解决方案
方法1:固定宽度格式化输出(推荐)
直接用zip把排名和查询结果配对,再通过f-string设置固定宽度实现整齐对齐,这种方式比纯制表符更稳定,不会因字符串长度差异导致错位。
修改后的完整代码:
import sqlite3 db = sqlite3.connect("C:\Users\marlo\Downloads\programs\chinook.db") cur = db.cursor() cur.execute("""SELECT artists.name, Title, COUNT(*) as count FROM invoice_items JOIN tracks ON invoice_items.TrackId = tracks.TrackId JOIN albums ON tracks.AlbumId = albums.AlbumId JOIN artists ON albums.ArtistId = artists.ArtistID GROUP BY Title ORDER BY count DESC LIMIT 10""") Album_ranking = cur.fetchall() # 打印表头,设置各字段宽度 print(f"{'Rank':<6} {'Artist Name':<25} {'Album Title':<40} {'Downloads':<10}") # 遍历排名与结果,格式化每行内容 for rank, (artist, album, downloads) in zip(range(1, 11), Album_ranking): print(f"{rank:<6} {artist:<25} {album:<40} {downloads:<10}")
代码说明:
{内容:<宽度}:表示将内容左对齐并占用指定宽度的字符位置- 你可以根据实际显示需求调整每个字段的宽度数值,比如专辑标题如果更长,可以把40改成更大的数。
方法2:制表符分隔输出
如果偏好制表符格式,同样用zip添加排名,然后用制表符拼接字段:
# 打印表头 print("Rank\tArtist Name\tAlbum Title\tNumber of Downloads") # 遍历输出每行 for rank, (artist, album, downloads) in zip(range(1, 11), Album_ranking): print(f"{rank}\t{artist}\t{album}\t{downloads}")
注意:这种方式下,若某字段字符串过长,会导致后续列错位,适合对排版精度要求不高的场景。
内容的提问来源于stack exchange,提问作者M.KLMN
相关产品推荐
相关产品推荐

