有我的代码
conn = sqlite3.connect('someDB.db')
c = conn.cursor()
c.execute("SELECT column FROM someDB")
result = c.fetchall()
当你看到它连接到db时,选择一个列并通过其中有4行的方式将其提取到结果中,当我打印结果时,1st和4th为null它给了我这个
[(None,), ('useful',), ('useful',), (None,)]
为什么每个元素之前和之后都有括号;也是括号元素;我如何摆脱它们只留下'无'和'有用'
期望的输出是
[None, 'useful', 'useful', None]
你也可以使用itertools
from itertools import chain
list(chain.from_iterable(result))
[None, 'useful', 'useful', None]
你的结果以它们的方式返回的原因是因为Cursor
对象返回Row
对象。当您从数据库中选择多个列时,这显然更明显/有用。
如果你总是需要获得列表中每个元组(单例)的第一个元素,那就是“通用”方式:
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]
好吧,如果数据库可能很大,首先构建一个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]