【问题标题】:how to filter out sqlite output如何过滤掉sqlite输出
【发布时间】:2019-02-18 14:45:53
【问题描述】:

这是我的代码

conn = sqlite3.connect('someDB.db')
c = conn.cursor()
c.execute("SELECT column FROM someDB")
result = c.fetchall()

如您所见,它连接到数据库,选择一列并将其提取到结果中 顺便说一下,里面有 4 行,第 1 和第 4 行是空的 当我打印结果时,它给了我这个

[(None,), ('useful',), ('useful',), (None,)]

为什么每个元素前后都有括号?也是括号元素;我如何摆脱它们,只留下“无”和“有用”

想要的输出是

[None, 'useful', 'useful', None]

【问题讨论】:

  • 期望的输出是什么?你能编辑问题来说明一下吗?
  • @aws_apprentice 已编辑
  • fetchall() 返回一个列表 => [result1, result2, ..., result]。每个结果都可以包含多列(您只选择了一个)=> (column1, column2, ....)

标签: python python-3.x sqlite output


【解决方案1】:

你也可以使用itertools

from itertools import chain

list(chain.from_iterable(result))

[None, 'useful', 'useful', None]

您的结果按原样返回的原因是Cursor 对象返回Row 对象。当您从数据库中选择多于 1 列时,这显然更明显/更有用。

【讨论】:

    【解决方案2】:

    如果您总是需要获取列表中每个元组(单例)的第一个元素,“通用”方式:

    inputs = [(None,), ('useful',), ('useful',), (None,)]
    outputs = []
    for tuples in inputs:
      outputs.append(tuples[0])
    

    如果你想要一些更 Pythonic 的东西,那么你可以使用 python 的list comprehension:

    outputs = [tuples[0] for tuples in inputs]
    

    您也可以使用变体,使用"spread" operator

    outputs = [first_element for (first_element, *other_elements) in inputs]
    

    最后,也许是最好的方法(我能想到的):

    outputs = [first_element for (first_element, ) in inputs]
    

    【讨论】:

      【解决方案3】:

      如果数据库可能很大,那么首先构建一个 1 元组列表以将其转换为值列表可能不是最佳选择。 sqlite3 的 Python 文档宣传使用 fetchmany 及其大小的默认值以获得最佳性能。

      最终列表可以这样构建:

      result = []
      while True:
          chunk = c.fetchmany()
          if len(chunk) == 0: break
          result.extend([row[0] for row in chunk])
      

      或者,如果您更喜欢使用生成器在一个单一的理解中构建列表:

      def chunks(cursor):
          while True:
              chunk = c.fetchmany()
              if len(chunk) == 0: return
              yield chunk
      
      ...
      result = [row[0] for chunk in chunks(c) for row in chunk]
      

      【讨论】:

        猜你喜欢
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 2014-12-16
        • 1970-01-01
        相关资源
        最近更新 更多