2009-08-20 15 views
302

リストを16進数にマップしようとしていますが、リストを別の場所で使用しようとしています。パイソン2.6で、これは簡単だった:Python 3.xでリストを返すためのmap()の取得

A: Pythonの2.6:

>>> map(chr, [66, 53, 0, 94]) 
['B', '5', '\x00', '^'] 

しかし、Pythonの3.1に、上記マップ・オブジェクトを返します。

B:のPython 3.1:

>>> map(chr, [66, 53, 0, 94]) 
<map object at 0x00AF5570> 

私は、Python 3.xの上(上記のように)マッピングされたリストを取得するにはどうすればよいですか?

また、これを行うより良い方法がありますか?私の最初のリストオブジェクトは約45個のアイテムを持ち、idはそれらを16進数に変換するのが好きです。なぜあなたはこれをやっていない

+0

@ meawoppl下記の私の答えを参照してください。http://stackoverflow.com/a/24507069/17523 –

答えて

462

は、この操作を行います。Pythonの3+で

list(map(chr,[66,53,0,94])) 

を、反復可能オブジェクトを反復処理する多くのプロセスがイテレータ自身を返します。ほとんどの場合、これはメモリの節約に終わり、より速く進むはずです。

# Prints "ABCD" 
for ch in map(chr,[65,66,67,68]): 
    print(ch) 
+1

すばらしい説明をありがとう!! – mozami

+10

もちろん、これを繰り返してもかまいません([65,66,67,68]のxはchr(x))。地図は必要ありません。 – hughdbrown

+0

@hughdbrown 3を使用するための引数。1の 'map'は、複雑な関数、大規模なデータセット、またはストリームを反復処理するときの遅延評価になります。 –

70

:それはリスト内包と呼ばれています

[chr(x) for x in [66,53,0,94]] 

。 Googleでは豊富な情報が見つかりますが、here's the link to the Python (2.6) documentation on list comprehensionsです。あなたはthe Python 3 documenationにもっと興味があるかもしれません。

+8

はいいいえ。 – hughdbrown

+4

Hmmmm。おそらく、リスト内包、ジェネレータ、map()、zip()、そしてPythonの他の多くの高速反復の良さについての一般的な投稿が必要になるかもしれません。 – hughdbrown

+23

もっと冗長なので、余分な変数(2回)を書かなければならないと思います...操作が複雑でラムダを書くことになったり、いくつかの要素を落とす必要がある場合は、マップ+フィルタよりも優れていますが、適用したい機能を既に持っている場合は、マップはより簡潔です。 – fortran

11

I:あなたがやろうとしているすべては最終的には、このリストの上に反復がある場合、あなたはまだそれほどのようなmapオブジェクトを反復処理することができるので

は、あってもリストに変換する必要はありませんPython 3.1には慣れていませんが、これはうまくいくのでしょうか?

[chr(x) for x in [66, 53, 0, 94]] 
+1

完璧に動作します。 – ExceptionSlayer

18

リストを返すマップ関数は、特に対話セッション中に入力を節約できるという利点があります。 lmap(str, x)は5つの文字(この場合は30%)よりも短くです:

lmap = lambda func, *iterable: list(map(func, *iterable) 

は次に仕事をする代わりにmaplmapを呼び出す:あなたはそれがリストを返します(python2のimapの類推で)lmap関数を定義することができますlist(map(str, x))であり、確かに[str(v) for v in x]より短い。 filterについても同様の機能を作成できます。

元の質問にコメントがありました:

は、私はそれがすべてのpython3のバージョンに適用される*はPython 3にリストを返すようにマップを()の取得に名前変更を示唆しています。これを行う方法はありますか? - 午後05時58

それでmeawoppl 1月24日には、それを行うことが可能ですが、それは非常に悪い考えです。Pythonの3.5で

__global_map = map #keep reference to the original map 
lmap = lambda func, *iterable: list(__global_map(func, *iterable)) # using "map" here will cause infinite recursion 
map = lmap 
x = [1, 2, 3] 
map(str, x) #test 
map = __global_map #restore the original map and don't do that again 
map(str, x) #iterator 
43

新規および端正:

[*map(chr, [66, 53, 0, 94])] 

Additional Unpacking Generalizations

+6

'list()'の何が問題なのですか? – Quelklef

+2

@Quelklef 'list()'は素敵に見えません – Arijoon

+1

@Quelklef:また、 'list'コンストラクタを調べる必要がなく、一般的な関数呼び出し機構を呼び出す必要がないため、アンパック方法は非常に高速です。長い入力の場合は問題ありません。短いものは大きな違いを生むことができます。上記のコードを 'tuple'として入力して繰り返し再構成しないようにすると、' ipython'のマイクロベンチマークでは、 'list()'ラッピングのアプローチがアンパックより約20%長くなります。絶対に言えば、私たちは約150nsの話をしていますが、それは簡単ですが、あなたはそのアイデアを得ることができます。 – ShadowRanger

0
list(map(chr, [66, 53, 0, 94])) 
のおかげで楽しみのためだけに、ここでそれを行う方法あなたがかもしれない( しかしべきではない)です

map(func、* iterables) - >マップオブジェクト 関数uを計算するイテレータを作成するそれぞれのイテラブルを から引きます。最短の反復可能性がなくなると停止します。

"イテレータを作成しますが、" それはイテレータを返すことを意味します。

「各iterableの引数を使用して関数を計算」

イテレータの次の()関数は、各イテレート可能オブジェクトの値を取り、位置一方にそれらのそれぞれを通過することを意味します関数のパラメータ。

map()funtionからイテレータを取得し、それをlist()組み込み関数に渡すか、リスト内包表記を使用します。

1

は、見やすくするためにmy old commentの変換:あなたの入力はASCII序であることが知られている場合は、「これを行うには良い方法」について完全にmapせずに、それはbytesとデコード、ラbytes(list_of_ordinals).decode('ascii')に変換することが一般的にはるかに高速です。値のうちstrが得られますが、変更可能性などのためにlistが必要な場合は、変換するだけで済みます(さらに高速です)。たとえば、45入力の変換ipythonマイクロベンチマークに:あなたはstrとしてそれを残す場合は

>>> %%timeit -r5 ordinals = list(range(45)) 
... list(map(chr, ordinals)) 
... 
3.91 µs ± 60.2 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each) 

>>> %%timeit -r5 ordinals = list(range(45)) 
... [*map(chr, ordinals)] 
... 
3.84 µs ± 219 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each) 

>>> %%timeit -r5 ordinals = list(range(45)) 
... [*bytes(ordinals).decode('ascii')] 
... 
1.43 µs ± 49.7 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each) 

>>> %%timeit -r5 ordinals = list(range(45)) 
... bytes(ordinals).decode('ascii') 
... 
781 ns ± 15.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each) 

、それは〜最速mapソリューションの時間の20%を取ります。リストに戻っても、最も速いmapソリューションの40%未満です。すべての入力が(例えばlatin-1、文字のロケール固有のエンコーディングごとにいくつかの1バイトまたは序)ASCII序数であればbytesbytes.decodeを経由して一括変換、その後listに戻って変換するバルク述べたように、多くの作業を保存ししかし、のみ動作します。

関連する問題