web-dev-qa-db-ja.com

python map string split list

str.split関数を文字列の配列にマップしようとしています。つまり、同じ形式に従う文字列配列内のすべての文字列を分割したいと思います。 Pythonでmapでそれを行う方法はありますか?たとえば、次のようなリストがあるとします。

>>> a = ['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']

mapを使用して文字列をスペースで分割し(split( ""))、リストを次のようにします。

>>> [['2011-12-22', '46:31:11'], ['2011-12-20', '20:19:17'], ['2011-12-20', '01:09:21']]
29
pacodelumberg

あまり知られていませんが、この目的のためだけに設計された関数 operator.methodcaller

>>> from operator import methodcaller
>>> a = ['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']
>>> map(methodcaller("split", " "), a)
[['2011-12-22', '46:31:11'], ['2011-12-20', '20:19:17'], ['2011-12-20', '01:09:21']]

この手法は、ラムダ式を使用した同等のアプローチよりも高速です。

40

map(lambda x: x.split(), a)が、リスト内包表記[x.split() for x in a]を使用すると、この場合はより明確になります。

23
Russell Dias

これは私がそれを行う方法です:

_>>> a=['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']
>>> map(str.split, a)
[['2011-12-22', '46:31:11'], ['2011-12-20', '20:19:17'], ['2011-12-20', '01:09:21']]
_

これは、strのリストがあることがわかっている場合にのみ機能します(つまり、splitと互換性のある方法でstrメソッドを実装するもののリストだけではありません)。また、空白文字のみで分割するsplit()を使用するのではなく、空白文字で分割するx.split(' ')のデフォルトの動作を使用することに依存します(つまり、タブ、改行、その他の空白は使用しません) )、このメソッドを使用して別の引数を渡すことができないため。これよりも複雑な動作を呼び出すには、リストの内包表記を使用します。

7
Ben

map を関数と組み合わせて使用​​します。きちんとした方法は lambda 関数を使用することです:

>>> a=['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']
>>> map(lambda s: s.split(), a)
[['2011-12-22', '46:31:11'], ['2011-12-20', '20:19:17'],
 ['2011-12-20', '01:09:21']]
7
phihag

指定された他の回答を比較するためのコミュニティwikiの回答

>>> from timeit import Timer
>>> t = {}
>>> t['methodcaller'] = Timer("map(methodcaller('split', ' '), a)", "from operator import methodcaller; a=['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']")
>>> t['lambda'] = Timer("map(lambda s: s.split(), a)", "a = ['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']")
>>> t['listcomp'] = Timer("[s.split() for s in a]", "a = ['2011-12-22 46:31:11','2011-12-20 20:19:17', '2011-12-20 01:09:21']")
>>> for name, timer in t.items():
...     print '%s: %.2f usec/pass' % (name, 1000000 * timer.timeit(number=100000)/100000)
... 
listcomp: 2.08 usec/pass
methodcaller: 2.87 usec/pass
lambda: 3.10 usec/pass
1
kojiro