【问题标题】:How do I convert tuple of tuples to list in one line (pythonic)?如何将元组的元组转换为一行列表(pythonic)?
【发布时间】:2011-11-17 17:40:54
【问题描述】:
query = 'select mydata from mytable'
cursor.execute(query)
myoutput = cursor.fetchall() 
print myoutput

(('aa',), ('bb',), ('cc',))

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

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

我可以这样做:

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

我确信这不是最好的方法。请赐教!

【问题讨论】:

    标签: python list tuples database-cursor


    【解决方案1】:

    这也有效:

    >>> tu = (('aa',), ('bb',), ('cc',))
    >>> import itertools
    >>> list(itertools.chain(*tu))
    ['aa', 'bb', 'cc']
    

    编辑 Could you please comment on the cost tradeoff? (for loop and itertools)

    Itertools 明显更快:

    >>> 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
    

    编辑 2 Could you pl explain itertools.chain(*)

    * 将序列解包为位置参数,在本例中为元组的嵌套元组。

    例子:

    >>> 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
    

    the documents on unpacking

    【讨论】:

    • 您能否评论一下成本权衡? (for循环和itertools)
    • 这就是我要找的,谢谢!你能解释一下 itertools.chain(*)
    • @ThinkCode:星号运算符解包一个序列,在本例中是元组列表。它不是 itertools 独有的。
    【解决方案2】:

    你可以的

    >>> tup = (('aa',), ('bb',), ('cc',))
    >>> lst = [a[0] for a in tup]
    >>> lst
    ['aa', 'bb', 'cc']
    

    【讨论】:

    • 谢谢。我正在尝试看看是否可以取消“for”循环。
    • 这段代码没有使用 for 循环——它使用了一个列表推导(虽然很明显“在幕后”它被转换成类似于 for 循环的东西,但人们并不期望做某事不使用某种循环的列表的每个元素,即使它伪装成列表理解或某种高阶函数......)
    【解决方案3】:

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

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

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

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

    简单的列表理解:

    mylist = [each[0] for each in myoutput]
    

    简单的生成器(节省内存使用):

    mygen = (each[0] for each in myoutput)
    for result in mygen:
        print result
    

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

    for each, in myoutput:
        print each
    

    如果您分析了您的代码并发现这是一个瓶颈,那么您可以选择可读性较低但速度更快的方法:

    import itertools
    mylist = list(itertools.chain(*myoutput))
    

    或者,如果您只需要处理它:

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

    【讨论】:

      【解决方案4】:

      您正在做的事情是正确的,但更简洁,可能表现更好

      >>> [item for item, in (('aa',), ('bb',), ('cc',)) ]
      ['aa', 'bb', 'cc']
      

      或者如果你讨厌for关键字,你可以使用map

      >>> map(lambda a:a[0], (('aa',), ('bb',), ('cc',)) )
      ['aa', 'bb', 'cc']
      

      这是另一种方式

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

      虽然 IMO 列表理解是最易读的

      【讨论】:

      • 列表推导不是 for 循环。
      【解决方案5】:

      这行得通:

      >>> 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.
      

      你也可以这样做:

      >>> list(zip(*tups)[0])
      ['aa', 'bb', 'cc']
      

      【讨论】:

      • 我喜欢!你能解释一下 list(*(zip(*tups))) 部分吗?这样我就很容易记住了。
      • *tups 和 zip 在这种情况下的行为对我来说是新事物。它也干净优雅。我希望这也是高效的。谢谢!
      • 我的开发机器上有 Python 2.6.6 并且 >>> tups=(('aa,','bb,','cc,')) >>> list(*(zip (*tups))) Traceback(最近一次调用最后一次):文件“”,第 1 行,在 类型错误:list() 最多接受 1 个参数(给定 3 个)给我一个错误。 list(zip(*tups)[0]) 虽然有效!
      【解决方案6】:

      做一个这样的列表理解:

      mylist = [ x[0] for x in myoutput ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 2011-07-27
        • 2015-09-24
        相关资源
        最近更新 更多