【问题标题】:Extracting first elements from a list of tuples using list comprehension [duplicate]使用列表理解从元组列表中提取第一个元素
【发布时间】:2014-12-06 06:12:36
【问题描述】:

我有一个元组列表,我想将每个元组的第一个元素提取到另一个列表中。 我有一个名为lst 的元组列表,并试图将元素提取到一个名为lst2 的列表中,我得到的是:

>>> lst = [(1, 2), (3, 4), (5, 6)]
>>> lst2 = []
>>> [lst2[i] = lst[i][0] for i in range(len(lst))]
  File "<stdin>", line 1
    [lst2[i] = lst[i][0] for i in range(len(list))]
              ^
SyntaxError: invalid syntax

所需的输出是[1, 3, 5]

你能帮忙弄清楚这个语法有什么问题吗?

【问题讨论】:

    标签: python list tuples list-comprehension


    【解决方案1】:

    另一种方法是使用zip()

    >>> lst = [(1,2), (3,4), (5,6)]
    >>> zip(*lst)
    [(1, 3, 5), (2, 4, 6)]
    >>> zip(*lst)[0]
    (1, 3, 5)
    >>> list(zip(*lst)[0])
    [1, 3, 5]
    

    但是,当你只需要一个列表时,这有点浪费。

    【讨论】:

      【解决方案2】:

      在一行中循环遍历列表时,不能使用等于运算符设置变量。你可以简单地这样做:

      list = [ (1,2), (3,4), (5,6)]
      list2 = []
      [list2.append(list[i]) for i in range(len(list))]
      

      【讨论】:

      • 可以,但你真的不应该。 :) 1) 其他人已经提到使用list 作为变量名,但我猜你只是从问题中复制了它。 2) 很少需要使用for i in range(len(some_list)),因为我们可以直接迭代序列类型。 3) list.append() 返回None,所以你在浪费性地创建一个充满`None的列表,然后把它扔掉。
      【解决方案3】:

      使用lstlst2 作为变量名,正如其他人所指出的list 是一个糟糕的选择。

      您不需要索引。使用索引通常被认为是不好的形式。

      lst2 = [ pair[0] for pair in lst]

      如果你真的,真的需要索引,用于一些数学或其他事情。

      lst2 = [ lst[i][0] for (i, pair) in enumerate(lst)]

      如果您需要处理二维数字矩阵,您可能需要了解numpy 并查看numpy.matrixnumpy.array

      【讨论】:

        【解决方案4】:

        在列表推导中,只能出现表达式。 list2[i] = list[i][0] 是一个赋值statement

        而且,您不需要使用索引来访问项目。只需迭代列表即可。

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

        顺便说一句,不要使用list 作为变量名。它隐藏了内置类型/函数list

        【讨论】:

        • 非常感谢!关于列表的事情:我知道,我只在终端(运行时)使用列表作为变量名。
        • @coding_brainfart,即使在交互式shell中,我也建议不要使用list。一旦你使用它,你就不能这样做:list('abc')
        • @coding_brainfart - Guido(Python 的创建者)建议为名称添加后缀,否则会用下划线掩盖内置函数。例如,您可以使用list_ 而不是list。大多数情况下我看到这个是id_,以避免隐藏内置函数id
        猜你喜欢
        • 2013-04-29
        • 2011-03-19
        • 2019-04-03
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        • 2012-02-29
        • 1970-01-01
        相关资源
        最近更新 更多