1

次のように、名前と名前を含むリストがあります。

names = ["John Smith", "Rob Julian", "Eric Walls"]

このリストの名だけを取得したい。

私はそれを行うことによってそれを達成しました:

first_names = [n.split(" ")[0] for n in names]

そしてそれは私に望ましい結果を与えました。

しかし、私の意見では、これはかなり醜いです、その目標を達成するためのより良い方法はありますか?

4

4 に答える 4

3

はい、しかし実際にはそうではありません。パフォーマンスの面では、あなたはあなたが持っているものでより良いです。

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

(私はそれらを異なる順序で数回実行しました、時間は一貫していました。)

于 2012-11-28T23:04:11.260 に答える
1

あなたのアプローチは素晴らしいと思いますが

first_names = [n.split()[0] for n in names]

少しすごいです。

これを読んでください。

于 2012-11-28T23:02:18.037 に答える
1

最高のパフォーマンスは、関数と一緒に無名関数を使用することで得られると思いmapます。

first = lambda n : n.split()[0]

first_names = map(first,names)
于 2012-11-28T23:15:02.350 に答える
0

私はそれが良いとは言いませんが、ここに別のアプローチがあります:

>>> names = ["John Smith", "Rob Julian", "Eric Walls"]
>>> first = lambda x:x.split()[0]
>>> map(first, names)
['John', 'Rob', 'Eric']
于 2012-11-28T23:15:25.047 に答える