17

タプルのタプルがあり、各タプルの最初の値をセットに入れたいと考えています。これを行うには map() を使用するのが良い方法だと思いましたが、タプルの最初の要素にアクセスする簡単な方法が見つからないということだけです。たとえば、タプルがあり((1,), (3,))ます。1 と 3 を含むセットを取得するために (0 番目の要素にアクセスしているset(map([0], ((1,), (3,))))場所) のようなことをしたいと思います。[0]私がそれを行うことができる唯一の方法は、関数を定義することです: def first(t): return t[0]. 関数を宣言せずにこれを1行で行う方法はありますか?

4

8 に答える 8

20

リスト内包表記を使用します。

data = ((1,), (3,))
print([x[0] for x in data])
于 2011-05-13T23:49:09.003 に答える
18

使用operator.itemgetter:

from operator import itemgetter
map(itemgetter(0), ((1,), (3,)))

リスト内包表記は一般的に読みやすいですが、itemgetterあなたが求めたものに最も近いものです。また、少し高速です。

>>> from timeit import timeit
>>> setup = 'from operator import itemgetter; lst=( ("a",), ("b",), (1,), (2,))'
>>> timeit('map(itemgetter(0), lst)', setup=setup)
0.13061050399846863
>>> timeit('[i[0] for i in lst]', setup=setup)
0.20302422800159547
于 2011-05-13T23:57:10.900 に答える
4
my_set = {x[0] for x in TUPLES}
于 2011-05-13T23:51:43.573 に答える
3

それを取得する別の方法:

set(x for x, in data)
于 2011-05-13T23:58:04.337 に答える
2

Python2.7および3.xでは集合の内包的包摂を使用できます。

>>> t = ((1,), (3,))
>>> s = {x[0] for x in t}
>>> s
set([1, 3])

またはPython<2.7の場合:

>>> s = set([x[0] for x in t])
>>> s
set([1, 3])
于 2011-05-13T23:52:25.483 に答える
2

lambdaPython は、キーワードを使用した無名関数の作成をサポートしています。これにより、関数を正式に定義せずに使用できます。あなたの例を考えると、次のようにラムダを使用します。

data = ((1,), (3,))
set(map(lambda x: x[0], data))

これは次と同等です。

def f(x):
    return x[0]

set(map(f, data))

しかし、他の人が言ったように、マップの使用よりもリスト内包表記が好まれます。

于 2011-05-13T23:51:21.223 に答える
2
data = ((1,), (3,))
s = set(zip(*data)[0])

タプルにさらに項目がある場合は、izip と islice を使用してメモリと時間を節約できます。

于 2011-05-14T00:00:49.267 に答える
1

@ウィンストンで行きます。リスト内包表記は素晴らしいです。本当にマップを使用したい場合は、以前に提案されたようにラムダを使用するか、論理的に同等のものを使用してください...

from operator import itemgetter
data = ((1,), (3,))
map(itemgetter(0), data)

これは単なる情報です。リストカンプを使用する必要があります

于 2011-05-13T23:58:19.443 に答える