次のように、名前と名前を含むリストがあります。
names = ["John Smith", "Rob Julian", "Eric Walls"]
このリストの名だけを取得したい。
私はそれを行うことによってそれを達成しました:
first_names = [n.split(" ")[0] for n in names]
そしてそれは私に望ましい結果を与えました。
しかし、私の意見では、これはかなり醜いです、その目標を達成するためのより良い方法はありますか?
次のように、名前と名前を含むリストがあります。
names = ["John Smith", "Rob Julian", "Eric Walls"]
このリストの名だけを取得したい。
私はそれを行うことによってそれを達成しました:
first_names = [n.split(" ")[0] for n in names]
そしてそれは私に望ましい結果を与えました。
しかし、私の意見では、これはかなり醜いです、その目標を達成するためのより良い方法はありますか?
はい、しかし実際にはそうではありません。パフォーマンスの面では、あなたはあなたが持っているものでより良いです。
first_names = []
for n in names:
first_names.append(n.split()[0])
動作しますが、Pythonでのリスト内包表記が大好きです。何が悪いのか
first_names = [n.split()[0] for n in names]
楽しみのために、次のこともできます。非常に大きなリストを処理している場合、これが最高のパフォーマンスを発揮する可能性があると思います。ただし、最初にそれを調査することをお勧めします。
first = lambda n : n.split()[0]
first_names = [first(name) for name in names]
これを包括的にするために、ラムダを使用してマッピングすることもできます。
first = lambda n : n.split()[0]
first_names = map(first,names)
コメントごとに、私はさらに別の方法を追加しています
from operator import itemgetter
first_names = map(itemgetter(0), map(str.split, names))
しかし、あなたのオリジナルが最も好まれているようです。速度が問題になる場合は、他の人をいじくり回したいと思うかもしれません。
最も科学的ではありませんが、約350万の名前のリストを使用して、ファイルn0-4を呼び出して上記を実行し、time n0;time n1; time n2; time n3; time n4
ここで実行した結果です。元のリスト内包表記が私のマシンで最速だったように見えます。
real 0m8.433s
user 0m7.064s
sys 0m1.288s
real 0m8.213s
user 0m6.852s
sys 0m1.300s
real 0m8.581s
user 0m7.240s
sys 0m1.264s
real 0m8.374s
user 0m7.164s
sys 0m1.140s
real 0m11.890s
user 0m10.101s
sys 0m1.672s
(私はそれらを異なる順序で数回実行しました、時間は一貫していました。)
最高のパフォーマンスは、関数と一緒に無名関数を使用することで得られると思いmap
ます。
first = lambda n : n.split()[0]
first_names = map(first,names)
私はそれが良いとは言いませんが、ここに別のアプローチがあります:
>>> names = ["John Smith", "Rob Julian", "Eric Walls"]
>>> first = lambda x:x.split()[0]
>>> map(first, names)
['John', 'Rob', 'Eric']