【问题标题】:Accessing a value in a tuple that is in a list访问列表中元组中的值
【发布时间】:2011-06-15 14:35:44
【问题描述】:
[(1,2), (2,3), (4,5), (3,4), (6,7), (6,7), (3,8)]

如何从这个列表中的每个元组返回第二个值?

期望的输出:

[2, 3, 5, 4, 7, 7, 8]

【问题讨论】:

    标签: python list tuples


    【解决方案1】:

    使用list comprehension

    [x[1] for x in L]
    

    【讨论】:

    • 我知道这是一个简单的问题。是这样一个精英的地方吗?尝试谷歌搜索问题,结果不是我需要的。我确实以艰难的方式学习了python,但我没有在那里找到它。我之前曾问过关于学习 Python 的最佳方法的问题,一致的答案是买一本基础书然后开始学习。这让我很沮丧,而且我无法在我搜索过的任何书籍或在线资料中找到解决方案到目前为止?另外,您的评论确实没有帮助,并且会阻止新手新成员在 SO 上发帖。
    • @Nai:我建议阅读 Python 教程:docs.python.org/tutorial/index.html。总的来说,文档非常好。有时,你只需要尝试一下;)
    • 我用谷歌搜索“访问元组中的项目”,目的是访问元组列表中的项目。它让我想到了你的问题,所以谢谢你。我对 Python 还很陌生,找不到特别直观的答案,但这就是我!
    • 我认为 SO 的整个概念是让您更容易找到问题的答案。为什么一个问题必须具有一定的难度才能有效?好问题,好答案。
    • 太棒了!简短、尖锐、中肯的回答简短、尖锐、中肯的问题。你们俩都让我开心!
    【解决方案2】:

    伊格纳西奥的答案就是你想要的。然而,作为一个也在学习 Python 的人,让我试着为你剖析一下……如前所述,它是一个列表推导(例如,在 DiveIntoPython3 中介绍)。这里有几点:

    [x[1] for x in L]

    • 注意代码行周围的[]。这些是定义列表的内容。这告诉您此代码返回一个列表,因此它是list 类型。因此,这种技术被称为“列表推导”。
    • L 是您的原始列表。所以你应该在执行上述代码之前定义L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
    • x 是一个只存在于理解中的变量 - 尝试在理解之外访问x,或者在执行上述行后输入type(x),它会告诉你NameError: name 'x' is not defined,而type(L) 返回@987654332 @。
    • x[1] 指向每个元组中的第二个 项,而x[0] 将指向第一个项中的每一个。
    • 所以这行代码的字面意思是“为列表 L 中的所有元组返回一个元组中的第二项。”

    在提出问题之前很难说出您尝试了多少问题,但也许您只是不熟悉理解?我会花一些时间阅读Chapter 3 of DiveIntoPython,或任何有关理解的资源。祝你好运。

    【讨论】:

    • 在 2.x 中,x 将存在于 LC 之外,最后一个值绑定到它。这在 3.x 中已修复。
    • 我没有意识到这一点。感谢您的信息。
    • 很棒的解释@gary。我特别感谢您指出 L 指的是什么。
    • 感谢@PatrickWilliams 的反馈。我很高兴这有帮助。您也可以使用[x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]],但这并不容易。
    【解决方案3】:

    列表推导式绝对是做到这一点的方法。另一种应该更快的方法是mapitemgetter

    import operator
    
    new_list = map(operator.itemgetter(1), old_list)
    

    针对 OP 无法在 google 上找到答案的评论,我将指出一种超级幼稚的方法。

    new_list = []
    for item in old_list:
        new_list.append(item[1])
    

    这个用途:

    1. 声明一个变量来引用一个空列表。
    2. for 循环。
    3. 在列表上调用append 方法。

    如果有人尝试学习一门语言,但自己无法将这些基本部分组合在一起,那么他们需要将其视为一种练习并自己完成,即使这需要 20 小时。

    人们需要学习如何思考自己想要什么并将其与可用工具进行比较。我的第二个答案中的每个元素都应包含在基本教程中。 不读书就无法学习编程

    【讨论】:

      【解决方案4】:

      您还可以通过zip 使用序列解包:

      L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
      
      _, res = zip(*L)
      
      print(res)
      
      # (2, 3, 5, 4, 7, 7, 8)
      

      这也会从丢弃的第一个元素创建一个元组_。只提取第二个是可能的,但更详细:

      from itertools import islice
      
      res = next(islice(zip(*L), 1, None))
      

      【讨论】:

        【解决方案5】:

        或者你可以使用pandas:

        >>> import pandas as pd
        >>> L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
        >>> df=pd.DataFrame(L)
        >>> df[1]
        0    2
        1    3
        2    5
        3    4
        4    7
        5    7
        6    8
        Name: 1, dtype: int64
        >>> df[1].tolist()
        [2, 3, 5, 4, 7, 7, 8]
        >>> 
        

        numpy:

        >>> import numpy as np
        >>> L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
        >>> arr=np.array(L)
        >>> arr.T[1]
        array([2, 3, 5, 4, 7, 7, 8])
        >>> arr.T[1].tolist()
        [2, 3, 5, 4, 7, 7, 8]
        >>> 
        

        【讨论】:

          【解决方案6】:
          a = [(0,2), (4,3), (9,9), (10,-1)]
          print(list(map(lambda item: item[1], a)))
          

          【讨论】:

          • 请稍微解释一下您的答案,以便其他搜索它的人更容易理解。
          猜你喜欢
          • 1970-01-01
          • 2021-05-29
          • 1970-01-01
          • 2021-08-11
          • 2015-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多