美文网首页
python列表遍历技巧拾遗

python列表遍历技巧拾遗

作者: PhilicX | 来源:发表于2018-07-13 18:41 被阅读100次

    最近用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列表遍历技巧拾遗

          本文链接:https://www.haomeiwen.com/subject/fmyjuftx.html