文字列を文字の配列に分割する方法は?


450

文字列を文字の配列に分割する答えをウェブで探してみましたが、簡単な方法を見つけることができないようです

str.split(//)Rubyのように動作しないようです。ループせずにこれを行う簡単な方法はありますか?


12
Pythonでは、文字列は置換以外のすべての目的ですでに文字の配列です。あなたは、それらをスライス参照またはその他のインデックスでアイテムを検索することができます
dansalmo

回答:


860
>>> s = "foobar"
>>> list(s)
['f', 'o', 'o', 'b', 'a', 'r']

リストが必要です


2
私の意見では、Rubyメソッドよりもはるかに優れています。Cタイプでは、シーケンスタイプ間を自由に変換できます。
arthurprs 2011

リストコンストラクタは、文字列を文字配列に自動的に変換するエレガントな機能です。Stringはユニコード文字の同種のシーケンスなので、Pythonで作業するのはとてもクールであり、作成者のGuidoはそれをより優れたものにしています。Pythonのすばらしい機能を愛する。
Doogle 2017

私はここにフラグを立ててこれを行わないようにしたいのですが、とにかく呼び出し可能にしたい場合は、この動作を回避できますcast_method = lambda x: [x]
madzohan


60

また、list()を使用せずに、この非常に単純な方法で行うこともできます。

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']

4
Stackoverflowへようこそ。答えを少し拡張して、それがどのように問題を解決するかを説明していただけませんか。
NJInamdar 2015年

21
これは単なるものforであり、説明することはあまりありません。データ構造に関するpythonチュートリアル、特にリスト内包を読むべきだと思います。
WhyNotHugo 2015

4
これは単にを意味list(map(lambda c: c, iter("foobar")))しますが、より読みやすく、意味があります。
no1xsyzy 2017

41

文字列を一度に1文字ずつ処理する場合。さまざまなオプションがあります。

uhello = u'Hello\u0020World'

リスト内包表記の使用:

print([x for x in uhello])

出力:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

マップの使用:

print(list(map(lambda c2: c2, uhello)))

出力:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

組み込みリスト関数の呼び出し:

print(list(uhello))

出力:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

forループの使用:

for c in uhello:
    print(c)

出力:

H
e
l
l
o

W
o
r
l
d

これらの各方法のパフォーマンス特性に違いはありますか?
qxzsilver

20

このタスクを達成するための別の2つの方法を検討しました。それは誰かのために役立つかもしれません。

最初のものは簡単です:

In [25]: a = []
In [26]: s = 'foobar'
In [27]: a += s
In [28]: a
Out[28]: ['f', 'o', 'o', 'b', 'a', 'r']

そして二番目は使い方maplambda機能。より複雑なタスクに適している場合があります。

In [36]: s = 'foobar12'
In [37]: a = map(lambda c: c, s)
In [38]: a
Out[38]: ['f', 'o', 'o', 'b', 'a', 'r', '1', '2']

例えば

# isdigit, isspace or another facilities such as regexp may be used
In [40]: a = map(lambda c: c if c.isalpha() else '', s)
In [41]: a
Out[41]: ['f', 'o', 'o', 'b', 'a', 'r', '', '']

その他のメソッドについては、Pythonのドキュメントをご覧ください


最初の方法は非常に簡単です。人々がもっと複​​雑なものを欲する理由はありますか?
undrline 2018年

こんにちは!最初のオプションは確かに簡単です。ただし、2番目の方法は、より複雑な処理を処理する可能性が高くなります。
Alexey Milogradov

19

タスクは、文字列の文字を繰り返し処理して、それらをリストに収集することになります。最も単純なソリューションは次のようになります

result = []
for character in string:
    result.append(character)

もちろん、それはちょうどに短縮することができます

result = [character for character in string]

しかし、同じことを行うより短い解決策がまだあります。

listコンストラクターは、任意の反復可能オブジェクト(イテレーター、リスト、タプル、文字列など)をリストに変換するために使用できます。

>>> list('abc')
['a', 'b', 'c']

大きな利点は、Python 2とPython 3の両方で同じように機能することです。

また、Python 3.5から(素晴らしいPEP 448のおかげで)、空のリストリテラルにアンパックすることで、任意の反復可能オブジェクトからリストを作成できるようになりました。

>>> [*'abc']
['a', 'b', 'c']

これはすっきりとしており、場合によってはlistコンストラクタを直接呼び出すよりも効率的です。

はPython 3ではリストを返さないmapため、ベースのアプローチを使用mapないことをお勧めします。Python3でフィルター、マップ、およびリデュースを使用する方法を参照してください。


最後の提案はとてもいいと思います。しかし、なぜあなたが他のアプローチのいくつかを再検討したのかはわかりません(それらのほとんど)はすでにここに投稿されており、驚くべき python 3.5ソリューションに気を取られています!
MSeifert 2016

13

私はあなただけの文字の配列が必要です:

arr = list(str)

strを特定のstrで分割したい場合:

# str = "temp//temps" will will be ['temp', 'temps']
arr = str.split("//")

12

split()組み込み関数は、特定の条件に基づいて値を分離するだけですが、単一の単語では、条件を満たすことができません。したがって、それはの助けを借りて解決できますlist()。内部的に配列を呼び出し、配列に基づいて値を格納します。

仮に

a = "bottle"
a.split() // will only return the word but not split the every single char.

a = "bottle"
list(a) // will separate ['b','o','t','t','l','e']


3

文字列への読み取り専用アクセスを希望する場合は、配列表記を直接使用できます。

Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> t = 'my string'
>>> t[1]
'y'

正規表現を使用せずにテストするのに役立ちます。文字列に終了改行が含まれていますか?

>>> t[-1] == '\n'
False
>>> t = 'my string\n'
>>> t[-1] == '\n'
True

1

まあ、私がリストバージョンを好きなように、これは私が見つけたもう1つのより冗長な方法です(しかし、それはクールなので、私はそれを争いに追加したいと思いました):

>>> text = "My hovercraft is full of eels"
>>> [text[i] for i in range(len(text))]
['M', 'y', ' ', 'h', 'o', 'v', 'e', 'r', 'c', 'r', 'a', 'f', 't', ' ', 'i', 's', ' ', 'f', 'u', 'l', 'l', ' ', 'o', 'f', ' ', 'e', 'e', 'l', 's']

camelcase = ''.join([text[i].upper() if i % 2 else text[i].lower() for i in range(len(text))])
whereisalext

1
from itertools import chain

string = 'your string'
chain(string)

に似てlist(string)いますが、使用時に遅延評価されるジェネレータを返すため、メモリ効率が高くなります。


これが反復可能である文字列自体よりもどこに役立つかわからない。
Ry-

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