python列表遍历技巧拾遗

最近用python做了一些微小的工作,跟pymysql库打了些交道,其中大概是由于自身的强迫症,踩了一些坑。坑并不大,但是爬坑的过程还是挺有意思的,总结如下。

pymysql最基本的用法就是当作python内的一个sql解释器

import pymysql
db = pymysql.connect("localhost", "root", "", "adt", charset="utf8")
cursor = db.cursor()

rand_query_sql = 'SELECT plan_id FROM plan ORDER BY rand() LIMIT 5'
cursor.execute(rand_query_sql)

results = cursor.fetchall()
print(results)
==============================================
((44141,), (70441,), (12831,), (81769,), (67917,))

无论sql语句中select了多少列,cursor.fetchall()的结果都是一个二维数组,当需要对结果进行遍历时就要写成这个样子:

for item in results:
    print(item[0])

问题就是,如果这个结果需要用到多次,那就要写多个“item[0]”,或者额外写一句 “res = item[0]”,看起来都不那么舒服。这时我首先想到的一个改进是这样的:

for item in [x[0] for x in results]:
    print(item)

这个方法除了简洁性仍值得吐槽之外,如果python解释器优化的不够,这个列表实际上要被多遍历一遍(这里我没研究过究竟会被怎样执行),所以也不够好。
下面这种写法是我最终在用的:

for [item] in results:
    print(item)

完美符合要求,更令人愉悦的是,这种写法在结果有多列的情形下同样适用:

rand_query_sql = 'SELECT plan_id, qty FROM plan ORDER BY rand() LIMIT 5'
cursor.execute(rand_query_sql)

results = cursor.fetchall()
print(results)

for [id, qty] in results:
    print(id, qty)
==============================================
43133 1
28841 57
107889 763
9272 71
13543 292

多个等长列表共同遍历是另一个经常碰到的场景:

for i in range(len(trainX0)):
    model.fit([trainX0[i], trainX1[i]], trainY[i], epochs=10)

用到了打包函数,改进后的写法:

for [x0, x1, y] in zip(trainX0, trainX1, trainY):
    model.fit([x0, x1], y, epochs=10)

感觉自己对“人生苦短,我用python”这句话有了更深的理解 : )

你可能感兴趣的:(python列表遍历技巧拾遗)