从Python的sqlite3获取字段值列表,而不是表示行的元组

从Python的sqlite3获取字段值列表,而不是表示行的元组,python,sqlite,Python,Sqlite,Python的模块总是返回元组列表,这真让人恼火!当我查询单个列时,我希望得到一个简单的列表 e、 g.当我执行 SELECT somecol FROM sometable 打电话 cursor.fetchall() 它回来了 [(u'one',), (u'two',), (u'three',)] 但我宁愿去 [u'one', u'two', u'three'] 有办法做到这一点吗 data=cursor.fetchall() COLUMN = 0 column=[elt[COLUMN]

Python的模块总是返回元组列表,这真让人恼火!当我查询单个列时,我希望得到一个简单的列表

e、 g.当我执行

SELECT somecol FROM sometable
打电话

cursor.fetchall()
它回来了

[(u'one',), (u'two',), (u'three',)]
但我宁愿去

[u'one', u'two', u'three']
有办法做到这一点吗

data=cursor.fetchall()
COLUMN = 0
column=[elt[COLUMN] for elt in data]

我以前的建议column=zip*data[column],如果数据是空元组,则会引发索引器。相反,上面的列表理解只创建了一个空列表。根据您的情况,提出索引器可能更可取,但我将让您自己决定。

考虑cursor.fetchall返回空列表的情况:

try:
    columnlist = list(zip(*cursor.fetchall())[COLUMN_INDEX])
except IndexError:
    columnlist = []

你真的不想这么做——任何你使用zip或列表理解的方法都只是消耗CPU周期和内存,而没有增加显著的价值。只要处理元组,你就会得到更好的服务

至于它返回元组的原因,这是因为这是fetchall的要求。

我使用pandas模块来处理类似表的内容:

df = pd.DataFrame(cursor.fetchall(), columns=['one','two'])
列“one”的值列表仅表示为:

df['one'].values
您甚至可以使用自己的索引进行数据引用:

df0 = pd.DataFrame.from_records(cursor.fetchall(), columns=['Time','Serie1','Serie2'],index='Time')
连接有一个属性

文件指出:

您可以将此属性更改为可调用属性,该属性接受游标和原始行作为元组,并将返回实际结果行。通过这种方式,您可以实现更高级的返回结果的方法,例如返回还可以按名称访问列的对象

要从SELECT(如id)返回单个值的列表,可以将lambda分配给row_工厂,该工厂返回每行中的第一个索引值;e、 g:

将sqlite3作为数据库导入 conn=db.connect'my.db' conn.row_工厂=lambda光标,行:行[0] c=连接光标 ids=c.execute'SELECT id FROM users'.fetchall 这会产生如下结果:

[1, 2, 3, 4, 5, 6] # etc.
也可以直接在光标对象本身上设置行工厂。实际上,如果在创建光标之前未在连接上设置行工厂,则必须在光标上设置行工厂:

c=连接光标 c、 行\工厂=lambda游标,行:{'foo':行[0]} 您可以在游标对象的生命周期内的任何时间点重新定义行工厂,并且可以将行工厂取消设置为“无”,以返回基于元组的默认结果:

c、 行工厂=无 c、 执行“从用户中选择id”。获取所有[1,2,3]等。
现在,您不必处理元组、pandas或以上任何一个不起作用的元组。

我从以下内容开始,这给了我相同类型的元组列表:

video_ids = []

for row in c.execute('SELECT id FROM videos_metadata'):
        video_ids.append(row)
…因此,为了解决它并得到我期望的列表,我只需显式地拉出返回元组中的第一个元素

video_ids = []

for row in c.execute('SELECT id FROM videos_metadata'):
        video_ids.append(row[0])
对于我来说,这似乎是一个很简单的解决方案,每个OP的问题都有一个单独的专栏,也许这在某种程度上是我没有想到的简单化。不知道它如何扩展,但运行速度足够快,可以处理我拥有的5000多个条目,而不需要太多的31ms,我们这里讨论的是SQLite,所以想必这不会处理数以百万计的行。

cursor.fetchall返回[u'one',u'two',u'two',u'two',]

如果您想要[u'one',u'two',u'three',请使用以下命令:


[x[0]代表游标中的x.fetchall]

惯用还是噱头?它健壮吗?对于lenfoo的哪些值,zip*foo保证不会被破坏?太好了。columnlist=listzip*cursor.fetchall[COLUMN_INDEX]Jeremiah我想你应该注意~unutbu的警告!我认为在我们的回答中出现了一些竞争条件。它们都坏了!~unutbu’s和我下面的答案都很好。简单且最好。我不知道为什么不接受这个答案!谢谢:我在这个问题第一次发布并解决后很久才回答了这个问题。至于接受与否,我很高兴它能帮上忙!为什么这不是答案?顺便说一句,谢谢@DarraghEnrightFWIW,不幸的是,你不能删除我尝试过的一个被接受的答案,但是这个答案对于现代python来说肯定是正确的。它不是答案,因为我已经多年没有在这里看过了。现在是了!对于现代python,请参见下一个答案。
video_ids = []

for row in c.execute('SELECT id FROM videos_metadata'):
        video_ids.append(row[0])