Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何将元组的元组转换为一行列表(pythonic)?_List_Cursor_Tuples_Python - Fatal编程技术网

List 如何将元组的元组转换为一行列表(pythonic)?

List 如何将元组的元组转换为一行列表(pythonic)?,list,cursor,tuples,python,List,Cursor,Tuples,Python,为什么它(cursor.fetchall)返回元组而不是元组,因为我的查询只要求一列数据 将其转换为['aa','bb','cc']的最佳方式是什么 我可以这样做: query = 'select mydata from mytable' cursor.execute(query) myoutput = cursor.fetchall() print myoutput (('aa',), ('bb',), ('cc',)) 我相信这不是最好的方法。请开导我 你可以这样做 mylist =

为什么它(cursor.fetchall)返回元组而不是元组,因为我的查询只要求一列数据

将其转换为
['aa','bb','cc']
的最佳方式是什么

我可以这样做:

query = 'select mydata from mytable'
cursor.execute(query)
myoutput = cursor.fetchall() 
print myoutput

(('aa',), ('bb',), ('cc',))
我相信这不是最好的方法。请开导我

你可以这样做

mylist = []
myoutput = list(myoutput)
for each in myoutput:
   mylist.append(each[0])

你所做的是正确的,但更简洁,可能表现得更好

>>> tup = (('aa',), ('bb',), ('cc',))
>>> lst = [a[0] for a in tup]
>>> lst
['aa', 'bb', 'cc']
或者如果你讨厌
关键字,你可以使用map

>>> [item for item, in (('aa',), ('bb',), ('cc',)) ]
['aa', 'bb', 'cc']
还有另一种方法

>>> map(lambda a:a[0], (('aa',), ('bb',), ('cc',)) )
['aa', 'bb', 'cc']
虽然IMO列表理解是最具可读性的

,但这同样适用:

>>> reduce(lambda a, b:a+b, (('aa',), ('bb',), ('cc',)) )
('aa', 'bb', 'cc')

编辑
您能对成本权衡发表意见吗?(用于环路和itertools)

Itertools的速度明显更快:

>>> tu = (('aa',), ('bb',), ('cc',))
>>> import itertools
>>> list(itertools.chain(*tu))
['aa', 'bb', 'cc']
编辑2
您能解释一下itertools.chain(*)吗

*
将序列解压为位置参数,在本例中是一个嵌套的元组

例如:

>>> t = timeit.Timer(stmt="itertools.chain(*(('aa',), ('bb',), ('cc',)))")
>>> print t.timeit()
0.341422080994
>>> t = timeit.Timer(stmt="[a[0] for a in (('aa',), ('bb',), ('cc',))]")
>>> print t.timeit()
0.575773954391
另一个例子:

>>> def f(*args):
...    print "len args:",len(args)
...    for a in args:
...       print a
... 
>>> tu = (('aa',), ('bb',), ('cc',))
>>> f(tu)
len args: 1
(('aa',), ('bb',), ('cc',))
>>> f(*tu)
len args: 3
('aa',)
('bb',)
('cc',)

请参阅。

执行如下列表理解:

>>> f('abcde')
len args: 1
abcde
>>> f(*'abcde')
len args: 5
a
b
c
d
e
为什么
cursor.fetchall()
返回一个元组而不是元组,因为我的查询只要求一列数据

外部元组是完整的结果;每个内部元组表示该结果中的一条记录;因为您只要求一个字段,所以每个内部元组只有一个元素

将其转换为['aa'、'bb'、'cc']的最佳方式是什么

有几种方法,哪种“最好”取决于你在做什么

简单列表理解:

mylist = [ x[0] for x in myoutput ]
简单生成器(节省内存使用):

如果您只需要处理
myoutput
中的项目,您也可以这样做

mygen = (each[0] for each in myoutput)
for result in mygen:
    print result
如果您分析了代码并发现这是一个瓶颈,那么您可以选择可读性较低但速度较快的:

for each, in myoutput:
    print each
或者,如果您只需要处理它:

import itertools
mylist = list(itertools.chain(*myoutput))
这项工作:

import itertools
for result in itertools.chain(*myoutput):
    print result
说明:

>>> tups=(('aa',), ('bb',), ('cc',))
>>> list(*(zip(*tups)))
['aa', 'bb', 'cc']
你也可以这样做:

1) *tups unpacks the nested tuples  ('aa'),('bb'),('cc')
2) zip produces a list of a single tuple with all the elements: [('aa','bb','cc')]
3) * unpacks that  into  'aa', 'bb', 'cc'
4) creates a list from that unpacking.

非常感谢。我正在试着看看是否可以去掉“for”循环。这段代码不使用for循环,而是使用一个列表(虽然很明显,它被转换成了类似于for循环的东西,但如果不使用某种循环,即使它伪装成列表理解或某种高阶函数,也不能期望对列表的每个元素都做些什么…)谢谢,我想还是应该使用for循环吧!列表理解不是for循环。你能评论一下成本权衡吗?(for loop和itertools)这就是我要找的,谢谢!你能解释一下itertools.chain(*)@ThinkCode:star操作符解压一个序列,在本例中是元组列表。它不是itertools所独有的。我喜欢它!你能解释一下列表(*(zip(*tups))吗部分?这样我可以很容易地记住它。*在这种情况下,tups和zip的行为对我来说是新事物。它也干净优雅。我希望这也是性能有效的。谢谢!我在我的开发机器上有Python 2.6.6,并且>>>tups=(('aa','bb','cc',)>>列表(*(zip(*tups)))回溯(最近一次调用):文件“”,第1行,在TypeError:list()中最多接受1个参数(给定3个),这给了我一个错误!
1) *tups unpacks the nested tuples  ('aa'),('bb'),('cc')
2) zip produces a list of a single tuple with all the elements: [('aa','bb','cc')]
3) * unpacks that  into  'aa', 'bb', 'cc'
4) creates a list from that unpacking.
>>> list(zip(*tups)[0])
['aa', 'bb', 'cc']