【问题标题】:Get the first element of each tuple in a list in Python [duplicate]在Python中获取列表中每个元组的第一个元素[重复]
【发布时间】:2014-04-20 04:08:44
【问题描述】:

一个 SQL 查询给了我一个元组列表,像这样:

[(elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), ...]

我想要每个元组的所有第一个元素。现在我用这个:

rows = cur.fetchall()
res_list = []
for row in rows:
    res_list += [row[0]]

但我认为可能有更好的语法来做到这一点。你知道更好的方法吗?

【问题讨论】:

    标签: python python-2.7 syntax


    【解决方案1】:

    使用list comprehension

    res_list = [x[0] for x in rows]
    

    下面是一个演示:

    >>> rows = [(1, 2), (3, 4), (5, 6)]
    >>> [x[0] for x in rows]
    [1, 3, 5]
    >>>
    

    或者,您可以使用解包而不是 x[0]

    res_list = [x for x,_ in rows]
    

    下面是一个演示:

    >>> lst = [(1, 2), (3, 4), (5, 6)]
    >>> [x for x,_ in lst]
    [1, 3, 5]
    >>>
    

    这两种方法实际上做同样的事情,所以你可以选择任何你喜欢的。

    【讨论】:

    • 谢谢!我还没有找到关于语法 x,_ 的文档。你知道我在哪里可以找到一些吗?
    • @Creak - x,_ 只是使用元组解包。你是对的,这方面的文档很难获得。我找到了这个link 和这个one,应该可以解释它是如何工作的。此外,_ 只是一个普通变量。我本可以完成x,y 并得到相同的结果。但是,我没有这样做,因为对于仅占位符的变量使用 _ 是 Python 的惯例。
    • 好的,我认为_ 是一个特殊字符,表示“1 个或多个元素”。那会很棒;)
    • 您给出的列表推导仅在元组恰好有两个条目时才有效。在 python3 中,您可以使用[x for x, *the_rest in rows],其中* 确实是“元组的其余元素”的特殊语法。对于适用于 python2 的列表理解,请使用 [iter(x).next() for x in rows]
    【解决方案2】:

    您可以使用列表推导:

    res_list = [i[0] for i in rows]
    

    这应该可以解决问题

    【讨论】:

      【解决方案3】:
      res_list = [x[0] for x in rows]
      

      参考http://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

      有关为什么更喜欢推导式而不是 map 等高阶函数的讨论,请访问 http://www.artima.com/weblogs/viewpost.jsp?thread=98196

      【讨论】:

        【解决方案4】:

        如果由于某些原因不想使用列表推导,可以使用mapoperator.itemgetter

        >>> from operator import itemgetter
        >>> rows = [(1, 2), (3, 4), (5, 6)]
        >>> map(itemgetter(1), rows)
        [2, 4, 6]
        >>>
        

        【讨论】:

          【解决方案5】:

          实现这一点的实用方法是使用以下命令解压缩列表:

          sample = [(2, 9), (2, 9), (8, 9), (10, 9), (23, 26), (1, 9), (43, 44)]
          first,snd = zip(*sample)
          print(first,snd)
          

          (2, 2, 8, 10, 23, 1, 43) (9, 9, 9, 9, 26, 9, 44)

          【讨论】:

            猜你喜欢
            • 2019-05-20
            • 1970-01-01
            • 1970-01-01
            • 2020-09-15
            • 2019-04-19
            • 2020-07-31
            • 2013-10-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多