访问列表中元组中的值


87
[(1,2), (2,3), (4,5), (3,4), (6,7), (6,7), (3,8)]

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

所需的输出:

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

Answers:


99

具有列表理解能力

[x[1] for x in L]

52
我知道这是一个简单的问题。这么一个精英主义者的地方吗?尝试搜索该问题,结果不是我所需要的。我确实很难学习python,但在那儿却找不到。之前我曾问过有关学习Python的最佳方法的问题,而一致的答案是买一本基础书,然后潜入水中。这让我感到沮丧,我也无法在我所搜索的任何书籍或在线资料中找到解决方案到目前为止?再者,您的评论确实没有帮助,不鼓励新手在SO上发帖。
super9 2011年

1
@Nai:我建议阅读Python教程:docs.python.org/tutorial/index.html。一般来说,文档非常好。有时,您只需要尝试;)
Felix Kling

19
我用Google访问“访问元组中的项”,目的是访问元组列表中的项。这使我想到了您的问题,谢谢。我对Python相当陌生,找不到特别直观的答案,但这就是我!
帕特里克·威廉姆斯

7
我认为SO的整个概念是使查找问题的答案更加容易。为什么问题必须具有一定难度才能有效?好问题,好答案。
Sceluswe

3
辉煌!一个简短而尖锐的问题的答案。你们俩都过得很愉快!
Eric M

81

伊格纳西奥的答案就是你想要的。但是,当有人也在学习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)return <class 'list'>
  • x[1]指向每个元组中的第二个项目,而x[0]指向每个元组中的每个项目。
  • 因此,这行代码的字面意思是“为列表L中的所有元组返回一个元组中的第二个项目”。

在问问题之前很难说出您曾尝试过多少次问题,但也许您只是不了解理解?我将花一些时间阅读DiveIntoPython的第3章,或有关理解的任何资源。祝好运。


4
在2.x中,x它将存在于LC外部,并绑定了最后一个值。此问题已在3.x中修复。
Ignacio Vazquez-Abrams,

我没有意识到这一点。谢谢(你的)信息。
加里

4
很棒的解释@gary。我特别感谢您指出L的含义。
帕特里克·威廉姆斯

感谢您的反馈@PatrickWilliams。我很高兴这会有所帮助。您也可以这样做,[x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]但是在眼睛上并不容易。
gary 2016年

5

列表理解绝对是做到这一点的方法。应该更快的另一种方法是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个小时,也可以自己完成。

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


2

或者您可以使用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]
>>> 

1

您还可以将序列拆包与使用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))

0
a = [(0,2), (4,3), (9,9), (10,-1)]
print(list(map(lambda item: item[1], a)))

1
请稍微解释一下您的答案,以便其他人更容易理解。
herrbischoff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.