有我的密码
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]
答案 0 :(得分:0)
如果您始终需要获取列表中每个元组(单个元素)的第一个元素,则采用“通用”方式:
inputs = [(None,), ('useful',), ('useful',), (None,)]
outputs = []
for tuples in inputs:
outputs.append(tuples[0])
如果您想要更多的Python语言,则可以使用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 :(得分:0)
您也可以使用itertools
from itertools import chain
list(chain.from_iterable(result))
[None, 'useful', 'useful', None]
按原样返回结果的原因是因为Cursor
对象返回了Row
对象。当您从数据库中选择多于1列时,这显然更为明显/有用。
答案 2 :(得分:0)
如果数据库可能很大,那么首先构建一个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]