リストにあるタプルの値にアクセスする


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

このリスト内の各タプルから2番目の値を返すにはどうすればよいですか?

必要な出力:

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

回答:


100

リストの内包

[x[1] for x in L]

52
これは簡単な質問だと思います。SOはそのようなエリート主義の場所ですか?質問をグーグルしてみてください、結果は私が必要とするものではありません。私はPythonを難しい方法で学びましたが、そこには見つかりませんでした。私は以前にPythonを学ぶための最良のアプローチについて質問しましたが、全会一致の答えは基本的な本を手に入れて飛び込むことです。それは私を苛立たせ、検索した本やオンライン資料で解決策を見つけることができません。これまでのところ?さらに、あなたのコメントは本当に役に立たず、初心者の新しいメンバーがSOに投稿するのを思いとどまらせます。
super9 2011年

1
@Nai:Pythonチュートリアルを読むことをお勧めします:docs.python.org/tutorial/index.html。一般的に、ドキュメントは非常に優れています。そして時々、試してみる必要があります;)
Felix Kling 2011年

19
タプルリスト内のアイテムにアクセスする目的で、「タプル内のアイテムへのアクセス」をグーグルで検索しました。それはあなたの質問に私をもたらしたので、ありがとう。私はPythonにかなり慣れていないので、特に直感的な答えは見つかりませんが、それは私だけです。
Patrick Williams

7
SOの全体的なコンセプトは、質問に対する答えを見つけやすくすることだと思いました。質問が有効であるために、なぜ特定の難しさが必要なのですか?良い質問、良い答え。
sceluswe 2016年

3
鮮やかさ!短くて鋭い、要点の質問に対する短い、鋭い、要点の答え。お二人とも私の一日を作りました!
エリックM

82

イグナシオの答えはあなたが望むものです。ただし、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)返されます<class 'list'>
  • x[1]各タプルの2番目のアイテムx[0]を指しますが、最初のアイテムのそれぞれを指します。
  • したがって、このコード行は文字通り「リストLのすべてのタプルのタプルの2番目の項目を返す」と読みます。

質問をする前にどれだけ問題を試みたかを知るのは難しいですが、おそらくあなたは理解に精通していなかったのでしょうか?DiveIntoPythonの第3章、または内包表記に関するリソースを読むのに少し時間を費やします。幸運を。


4
2.xでは、xLCの外部に存在し、最後の値がそれにバインドされます。これは3.xで修正されています。
Ignacio Vazquez-Abrams 2011年

気づかなかった。情報をありがとう。
ゲイリー2011年

4
素晴らしい説明@gary。特にLが何を指しているのかご指摘いただきありがとうございます。
Patrick Williams

フィードバック@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がグーグルで答えを見つけることができなかったというコメントに応えて、私はそれをするための非常に素朴な方法を指摘します。

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

これは以下を使用します:

  1. 空のリストを参照する変数を宣言します。
  2. forループ。
  3. appendリストのメソッドを呼び出す。

誰かが言語を学ぼうとしていて、これらの基本的な部分を自分でまとめることができない場合、彼らはそれを演習見なし、 20時間かかっても自分で行う必要があります

自分が何を望んいるのかを考え、それを利用可能なツールと比較する方法を学ぶ必要があります。2番目の回答のすべての要素は、基本的なチュートリアルで説明する必要があります。あなたは1つを読まずにプログラミングを学ぶことはできません


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)

これにより_、破棄された最初の要素からタプルも作成されます。2番目のみを抽出することは可能ですが、より冗長です。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.