607

リストを16進数にマップしてから、他の場所でリストを使用しようとしています。Python 2.6では、これは簡単でした。

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で(上記のAのように)マップされたリストを取得するにはどうすればよいですか?

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

4

11 に答える 11

874

これを行う:

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

Python 3以降では、イテレータを反復処理する多くのプロセスがイテレータ自体を返します。ほとんどの場合、これはメモリを節約することになり、物事をより速くするはずです。

map最終的にこのリストを反復処理するだけの場合は、次のようにオブジェクトを反復処理できるため、リストに変換する必要はありません。

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)
于 2009-08-20T00:28:40.710 に答える
155

Python 3.5の新しくてすっきりした:

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

追加の開梱の一般化に感謝します

アップデート

常に短い方法を探していましたが、これも機能することを発見しました。

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

解凍はタプルでも機能します。最後のコンマに注意してください。これにより、1要素のタプルになります。つまり、(*map(chr, [66, 53, 0, 94]),)

リスト括弧付きのバージョンから1文字だけ短くなっていますが、私の意見では、アスタリスク(拡張構文)ですぐに開始するため、書く方が良いと思います。:)

于 2016-08-01T15:18:41.900 に答える
112

なぜあなたはこれをしないのですか?

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

それはリスト内包と呼ばれます。Googleにはたくさんの情報がありますが、リスト内包表記に関するPython(2.6)ドキュメントへのリンクは次のとおりです。ただし、 Python3のドキュメントにもっと興味があるかもしれません。

于 2009-08-20T00:28:19.167 に答える
29

リストを返すマップ機能には、特にインタラクティブセッション中に、入力を節約できるという利点があります。リストを返すlmap関数を(python2と同様に)定義できます。imap

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

lmap次に、の代わりに呼び出すmapと、ジョブが実行 されます。よりもlmap(str, x)5文字短く(この場合は30%)、list(map(str, x))確かに。よりも短くなり[str(v) for v in x]ます。同様の関数を作成することもできますfilter

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

すべてのPython3バージョンに適用されるため、Python 3. *でリストを返すには、Getting map()に名前を変更することをお勧めします。これを行う方法はありますか?–meawoppl1月24日17:58

それ可能ですが、それは非常に悪い考えです。楽しみのために、これがあなたがそれをするかもしれない(しかしすべきではない)方法です:

__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
于 2014-07-01T09:41:21.660 に答える
6

可視性を高めるために私の古いコメントを変換する:map入力がASCII序数であることがわかっている場合、「これを行うためのより良い方法」として、入力がASCII序数であることがわかっている場合は、一般に、変換bytesとデコードの方がはるかに高速bytes(list_of_ordinals).decode('ascii')です。これstrで値がわかりますが、list可変性などが必要な場合は、変換するだけで済みます(さらに高速です)。たとえば、ipython45個の入力を変換するマイクロベンチマークでは、次のようになります。

>>> %%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)

のままにしておくと、最速のソリューションstrの約20%の時間がかかります。リストに戻すことでさえ、それはまだ最速のソリューションmapの40%未満です。mapを介しbytesて一括変換しbytes.decodeてから一括変換して戻すとlist、多くの作業が節約されます、前述のように、すべての入力がASCII序数(または、文字ロケール固有のエンコーディングごとに1バイトの序数など)である場合にのみ機能しますlatin-1

于 2017-11-08T04:52:46.617 に答える
2
list(map(chr, [66, 53, 0, 94]))

map(func、* iterables)->mapobject各イテレータからの引数を使用して関数を計算するイテレータを作成します。最短のイテラブルがなくなると停止します。

「イテレータを作成する」

イテレータを返すことを意味します。

「各反復可能オブジェクトからの引数を使用して関数を計算します」

イテレータのnext()関数は、各イテレータの1つの値を取り、それらのそれぞれを関数の1つの位置パラメータに渡すことを意味します。

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

于 2017-11-07T09:04:30.490 に答える
1

上記の回答に加えて、次のように結果値をPython 3作成することもできます。listmap

li = []
for x in map(chr,[66,53,0,94]):
    li.append(x)

print (li)
>>>['B', '5', '\x00', '^']

私が打たれた別の例で一般化すると、マップ上の操作も問題と同じように処理でき、マップするアイテムの取得と結果セットの取得を同時に行うregex関数を記述できます。list元。

b = 'Strings: 1,072, Another String: 474 '
li = []
for x in map(int,map(int, re.findall('\d+', b))):
    li.append(x)

print (li)
>>>[1, 72, 474]
于 2018-06-15T16:35:30.993 に答える
0

オブジェクト内の各アイテムを繰り返し処理し、それを別の変数に格納するだけで、マップオブジェクトからリストを取得してみることができます。

a = map(chr, [66, 53, 0, 94])
b = [item for item in a]
print(b)
>>>['B', '5', '\x00', '^']
于 2020-02-08T14:17:54.073 に答える
0

もう1つのオプションは、ショートカットを作成してリストを返すことです。

from functools import reduce
_compose = lambda f, g: lambda *args: f(g(*args))
lmap = reduce(_compose, (list, map))

>>> lmap(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']
于 2020-11-16T12:45:42.147 に答える
0

pyton3.Xでこれを行うための最良の方法

簡単にこれを1行で行うことができます

#Devil
input_list = [66, 53, 0, 94]
out = [chr(x) for x in input_list]
print(out)

# you will get the desire output in out list
# ['B', '5', '\x00', '^']

#------------------------------
#To retrieve your list use 'ord'

original_list = [ord(x) for x in out]
print(original_list )
#[66, 53, 0, 94]
于 2022-03-03T10:59:23.993 に答える
-1

Pythonのリスト内包表記と基本的なマップ関数ユーティリティを使用して、これを行うこともできます。

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

于 2018-11-11T16:57:14.047 に答える