すべてのリスト要素でint()関数を呼び出しますか?


184

次のように、数値文字列を含むリストがあります。

numbers = ['1', '5', '10', '8'];

すべてのリスト要素を整数に変換したいので、次のようにします。

numbers = [1, 5, 10, 8];

次のようにループを使用してそれを行うことができます:

new_numbers = [];
for n in numbers:
    new_numbers.append(int(n));
numbers = new_numbers;

それはとても醜い必要がありますか?1行のコードでこれを行うためのよりPython的な方法があると確信しています。私を助けてください。


1
どのバージョンのPythonを使用していますか?
Mark Byers、2010

回答:



131

Python 2.xでは、別のアプローチとして次のものを使用しますmap

numbers = map(int, numbers)

注:Python 3.xではmap、必要に応じてリストに変換できるマップオブジェクトを返します。

numbers = list(map(int, numbers))

11
Python 3.xでは、mapリストではなくイテレータを返すためlist(map(int, numbers))、リストが必要であるかのように記述する必要があります。
kennytm 2010

2
私は現在、リストの理解のアプローチがもう少し好まれていると思います。
エクストラネオン、2010

3
@extraneon:ええ...あるいは、リストの代わりにジェネレータを使用することを検討してください。ジェネレーターの利点は、すべての要素を調べる必要がない場合に、事前にそれらを計算する時間を無駄にする必要がないことです。
Mark Byers、

4
Python 2.7.2でTimeitを使用して測定:LC:3.578153133392334、マップ:4.9065070152282715
AJJ

1
@AJJ:mapセットアップのオーバーヘッドが高くなりますが、参照インタープリターでは、変換関数がCで実装されたPython組み込み関数の場合、アイテムあたりのコストが低くなります。4つの値のみの入力でテストしても、スケーリングに関する有用な情報は得られません。とは言っても、私自身のテスト(Py2.7.12とPy3.5.2、後者はlist()ラッピング)では、Py2 mapは4つの要素の入力に対しても勝ち、Py3のわずかなマージンだけで負けました。私はあなたのテストがlistcompsに賛成して歪められたと思います。
ShadowRanger 2016年

21

ただのポイント、

numbers = [int(x) for x in numbers]

リストの理解はより自然ですが、

numbers = map(int, numbers)

より速いです。

おそらくこれはほとんどの場合問題にはなりません

役立つ情報:LP vsマップ


6
number = map(int、number)にすべきではありませんか?
Karan

9

これらの整数を関数またはメソッドに渡す場合は、次の例を検討してください。

sum(int(x) for x in numbers)

この構造は、adamkによって言及されたリスト内包表記に意図的に著しく類似しています。角括弧がない場合、これはジェネレータ式と呼ばれ、引数のリストをメソッドに渡す非常にメモリ効率の良い方法です。良い議論がここにあります:ジェネレータ式対リスト内包


4

Python 3で作成する別の方法:

numbers = [*map(int, numbers)]


1
これを説明できますか?私はその構文に慣れていません。ありがとう!
abalter

1
引数リストの解凍(docs.python.org/3/tutorial/…)を使用しています
zhukovgreen

Aha、Python 3のこと。[]引数リストを取るのはおかしいようです。また、引数リストとしてイテレータを渡すことができることを知りませんでした。と思っていただろうnumber = list(map(int, numbers))。しかし、説明をありがとう!
abalter

3

別の方法、

for i, v in enumerate(numbers): numbers[i] = int(v)

6
OPはpythonicを言った
SilentGhost 2010

3
この方法は、リスト内の一部の要素に対してのみ操作を実行する場合に非常に役立ちます。これはこのスレッドの質問には関係ありませんが、役立つ場合もあります
Dikla

1

私は答えを統合していくつかのtimeit結果を示すと思いました。

Python 2はこれではかなりひどいmapですが、理解よりも少し速いです。

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
116.25092001434314
>>> timeit.timeit('map(int, l)', setup)
106.66044823117454

Python 3はそれ自体で4倍以上高速ですが、mapジェネレーターオブジェクトをリストに変換することは、理解よりも高速であり、mapジェネレーターをアンパックしてリストを作成すること(Artemに感謝します)は、わずかに高速です。

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
25.133059591551955
>>> timeit.timeit('list(map(int, l))', setup)
19.705547827217515
>>> timeit.timeit('[*map(int, l)]', setup)
19.45838406513076

注:Python 3では、4つの要素がクロスオーバーポイント(Python 2では3)のように見えますが、理解力はわずかに高速ですが、ジェネレーターのアンパックは、複数の要素を持つリストのどちらよりも高速です。

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