207

以下のようなリストがあります。最初の要素はidで、もう1つは文字列です。

[(1, u'abc'), (2, u'def')]

以下のように、このタプルのリストからのみIDのリストを作成したいと思います。

[1,2]

このリストをで使用する__inので、整数値のリストである必要があります。

4

14 に答える 14

305
>>> a = [(1, u'abc'), (2, u'def')]
>>> [i[0] for i in a]
[1, 2]
于 2012-08-27T13:25:51.693 に答える
85

zip関数を使用して、要素を分離します。

>>> inpt = [(1, u'abc'), (2, u'def')]
>>> unzipped = zip(*inpt)
>>> print unzipped
[(1, 2), (u'abc', u'def')]
>>> print list(unzipped[0])
[1, 2]

編集(@BradSolomon):上記はPython 2.xで機能しzip、リストを返します。

Python 3.xではzip、イテレータを返します。以下は上記と同等です。

>>> print(list(list(zip(*inpt))[0]))
[1, 2]
于 2015-07-08T15:32:57.773 に答える
22

このような意味ですか?

new_list = [ seq[0] for seq in yourlist ]

実際に持っているのはtupleオブジェクトのリストであり、セットのリストではありません(元の質問が暗示しているように)。それが実際にセットのリストである場合、セットには順序がないため、最初の要素はありません。

ここではフラットリストを作成しました。これは、一般に、1要素のタプルのリストを作成するよりも便利なように思われるためです。seq[0]ただし、。に置き換えるだけで、1要素タプルのリストを簡単に作成できます(seq[0],)

于 2012-08-27T12:39:22.720 に答える
15

これがoperator.itemgetter目的です。

>>> a = [(1, u'abc'), (2, u'def')]
>>> import operator
>>> b = map(operator.itemgetter(0), a)
>>> b
[1, 2]

このitemgetterステートメントは、指定したインデックスの要素を返す関数を返します。書くのと全く同じです

>>> b = map(lambda x: x[0], a)

しかし、それitemgetterはより明確でより明確であることがわかりました。

これは、コンパクトなソートステートメントを作成するのに便利です。例えば、

>>> c = sorted(a, key=operator.itemgetter(0), reverse=True)
>>> c
[(2, u'def'), (1, u'abc')]
于 2016-06-28T04:43:28.967 に答える
13

「タプルアンパック」を使用できます。

>>> my_list = [(1, 'abc'), (2, 'def')]
>>> my_ids = [idx for idx, val in my_list]
>>> my_ids
[1, 2]

反復時に、各タプルが解凍され、その値が変数idxとに設定されますval

>>> x = (1, 'abc')
>>> idx, val = x
>>> idx
1
>>> val
'abc'
于 2017-04-03T13:12:21.517 に答える
12

さまざまなアプローチの実行時間を比較することが役立つかもしれないと考えていたので、ベンチマークを作成しました(simple_benchmarkライブラリを使用)

I)2つの要素を持つタプルを持つベンチマーク ここに画像の説明を入力してください

インデックスによってタプルから最初の要素を選択することを期待できるように0、正確に2つの値を期待することにより、解凍ソリューションに非常に近い最速のソリューションであることが示されます

import operator
import random

from simple_benchmark import BenchmarkBuilder

b = BenchmarkBuilder()



@b.add_function()
def rakesh_by_index(l):
    return [i[0] for i in l]


@b.add_function()
def wayneSan_zip(l):
    return list(list(zip(*l))[0])


@b.add_function()
def bcattle_itemgetter(l):
     return list(map(operator.itemgetter(0), l))


@b.add_function()
def ssoler_upacking(l):
    return [idx for idx, val in l]

@b.add_function()
def kederrack_unpacking(l):
    return [f for f, *_ in l]



@b.add_arguments('Number of tuples')
def argument_provider():
    for exp in range(2, 21):
        size = 2**exp
        yield size, [(random.choice(range(100)), random.choice(range(100))) for _ in range(size)]


r = b.run()
r.plot()

II)2つ以上の要素を持つタプルを持つベンチマーク ここに画像の説明を入力してください

import operator
import random

from simple_benchmark import BenchmarkBuilder

b = BenchmarkBuilder()

@b.add_function()
def kederrack_unpacking(l):
    return [f for f, *_ in l]


@b.add_function()
def rakesh_by_index(l):
    return [i[0] for i in l]


@b.add_function()
def wayneSan_zip(l):
    return list(list(zip(*l))[0])


@b.add_function()
def bcattle_itemgetter(l):
     return list(map(operator.itemgetter(0), l))


@b.add_arguments('Number of tuples')
def argument_provider():
    for exp in range(2, 21):
        size = 2**exp
        yield size, [tuple(random.choice(range(100)) for _
                     in range(random.choice(range(2, 100)))) for _ in range(size)]

from pylab import rcParams
rcParams['figure.figsize'] = 12, 7

r = b.run()
r.plot()
于 2020-02-18T12:25:53.700 に答える
8

タプルが一意である場合、これは機能します

>>> a = [(1, u'abc'), (2, u'def')]
>>> a
[(1, u'abc'), (2, u'def')]
>>> dict(a).keys()
[1, 2]
>>> dict(a).values()
[u'abc', u'def']
>>> 
于 2015-09-29T14:36:20.120 に答える
8

パフォーマンスの観点から、python3.Xで

  • [i[0] for i in a]list(zip(*a))[0]同等です
  • 彼らはより速いlist(map(operator.itemgetter(0), a))

コード

import timeit


iterations = 100000
init_time = timeit.timeit('''a = [(i, u'abc') for i in range(1000)]''', number=iterations)/iterations
print(timeit.timeit('''a = [(i, u'abc') for i in range(1000)]\nb = [i[0] for i in a]''', number=iterations)/iterations - init_time)
print(timeit.timeit('''a = [(i, u'abc') for i in range(1000)]\nb = list(zip(*a))[0]''', number=iterations)/iterations - init_time)

出力

3.491014136001468e-05

3.422205176000717e-05

于 2017-12-30T23:54:27.747 に答える
4

私が走ったとき(上記のように):

>>> a = [(1, u'abc'), (2, u'def')]
>>> import operator
>>> b = map(operator.itemgetter(0), a)
>>> b

戻る代わりに:

[1, 2]

私はこれを返品として受け取りました:

<map at 0xb387eb8>

list()を使用する必要があることがわかりました:

>>> b = list(map(operator.itemgetter(0), a))

この提案を使用してリストを正常に返すには。そうは言っても、私はこの解決策に満足しています、ありがとう。(Spyder、iPythonコンソール、Python v3.6を使用してテスト/実行)

于 2017-03-20T05:46:50.170 に答える
2

なぜ誰もnumpyの使用を提案しなかったのか疑問に思いましたが、確認したところ、わかりました。混合型配列には最適ではないかもしれません。

これはnumpyの解決策になります:

>>> import numpy as np

>>> a = np.asarray([(1, u'abc'), (2, u'def')])
>>> a[:, 0].astype(int).tolist()
[1, 2]
于 2020-04-06T15:57:11.853 に答える
1

タプルを解凍し、リスト内包表記を使用して最初の要素のみを取得できます。

l = [(1, u'abc'), (2, u'def')]
[f for f, *_ in l]

出力:

[1, 2]

これは、タプルに含まれる要素の数に関係なく機能します。

l = [(1, u'abc'), (2, u'def', 2, 4, 5, 6, 7)]
[f for f, *_ in l]

出力:

[1, 2]
于 2020-02-17T18:57:49.977 に答える
1

リストまたはタプルの要素を取得するには、リストまたはタプルを反復処理できます

a = [(1, u'abc'), (2, u'def')]

list1 = [a[i][0] for i in range(len(a))]

print(list1)
于 2021-06-16T04:47:34.890 に答える
1

私はこの方法で圧縮することを好みます:

>>> lst = [(1, u'abc'), (2, u'def')]
>>> new, _ = zip(*lst)
>>> new
(1, 2)
>>> 

または、追加の値がいくつあるかわからない場合:

>>> new, *_ = zip(*lst)
>>> new
(1, 2)
>>> 
于 2021-11-08T04:07:15.430 に答える
0

それらはタプルであり、セットではありません。あなたはこれを行うことができます:

l1 = [(1, u'abc'), (2, u'def')]
l2 = [(tup[0],) for tup in l1]
l2
>>> [(1,), (2,)]
于 2012-08-27T12:40:14.657 に答える