69

基本的に、ファイルからテキスト行を吸い出し、文字をリストに割り当て、リスト内のすべての個別の文字のリスト (リストのリスト) を作成したいと考えています。

現時点では、私はこれを試しました:

fO = open(filename, 'rU')
fL = fO.readlines()

それは私が持っているすべてです。単一の文字を抽出して新しいリストに割り当てる方法がよくわかりません。

ファイルから取得する行は次のようになります。

fL = 'FHFF HHXH XXXX HFHX'

私はそれをこのリストに変えたいと思っています。

['F', 'H', 'F', 'F', 'H', ...]
4

10 に答える 10

149

listを使用してこれを行うことができます:

new_list = list(fL)

私の知る限りでは、行内のスペースはすべてこのリストに含まれることに注意してください。

于 2012-03-23T02:34:10.543 に答える
62

ちょっと遅い気がするけど…

a='hello'
print list(a)
# ['h','e','l','l', 'o']
于 2016-06-11T16:12:09.657 に答える
30

文字列は (リストのように) 反復可能です。

私はあなたが本当に次のようなものが欲しいと解釈しています:

fd = open(filename,'rU')
chars = []
for line in fd:
   for c in line:
       chars.append(c)

また

fd = open(filename, 'rU')
chars = []
for line in fd:
    chars.extend(line)

また

chars = []
with open(filename, 'rU') as fd:
    map(chars.extend, fd)

chars には、ファイル内のすべての文字が含まれます。

于 2012-03-23T02:37:27.890 に答える
15

パイソン >= 3.5

バージョン 3.5 以降では、PEP 448 - Extended Unpacking Generalizationsを使用できます。

>>> string = 'hello'
>>> [*string]
['h', 'e', 'l', 'l', 'o']

これは言語構文の仕様であるため、 を呼び出すよりも高速ですlist

>>> from timeit import timeit
>>> timeit("list('hello')")
0.3042821969866054
>>> timeit("[*'hello']")
0.1582647830073256
于 2019-06-08T07:28:40.400 に答える
10

したがって、文字列helloを個々の文字としてリストに追加するには、次のようにします。

newlist = []
newlist[:0] = 'hello'
print (newlist)

  ['h','e','l','l','o']

ただし、これを行う方が簡単です。

splitlist = list(newlist)
print (splitlist)
于 2014-01-14T16:21:34.383 に答える
7
fO = open(filename, 'rU')
lst = list(fO.read())
于 2012-03-23T03:04:17.323 に答える
4

または、非常に非常に大きなファイル/リストを操作するときに、「計算上より効率的」であるはずの凝ったリスト内包表記を使用します

fd = open(filename,'r')
chars = [c for line in fd for c in line if c is not " "]
fd.close()

ところで:受け入れられた答えは、空白を考慮していません...

于 2013-07-25T04:33:09.913 に答える
4
a='hello world'
map(lambda x:x, a)

['こんにちは世界']

簡単な方法は、関数「map()」を使用することです。

于 2015-07-22T02:55:46.953 に答える
3

Python では、ファイルや文字列など、多くのものが反復可能です。ファイルハンドラーを反復処理すると、そのファイル内のすべての行のリストが得られます。文字列を反復すると、その文字列内のすべての文字のリストが得られます。

charsFromFile = []
filePath = r'path\to\your\file.txt' #the r before the string lets us use backslashes

for line in open(filePath):
    for char in line:
        charsFromFile.append(char) 
        #apply code on each character here

または、ワンライナーが必要な場合

#the [0] at the end is the line you want to grab.
#the [0] can be removed to grab all lines
[list(a) for a in list(open('test.py'))][0]  

.

.

編集:agfが使用できる言及としてitertools.chain.from_iterable

つかむ行を指定する機能が必要でない限り、彼の方法の方が優れています list(itertools.chain.from_iterable(open(filename, 'rU)))

ただし、これには itertools に精通している必要があり、その結果、読みやすさがいくらか失われます

文字を繰り返し処理したいだけで、リストを保存する必要がない場合は、ネストされた for ループを使用します。この方法は、最も読みやすい方法でもあります。

于 2012-03-23T03:23:22.183 に答える
0

文字列は (不変の) シーケンスであるため、リストのようにアンパックできます。

with open(filename, 'rU') as fd:
    multiLine = fd.read()
    *lst, = multiLine

map(lambda x: x, multiLine) を実行すると明らかに効率的ですが、実際にはリストではなくマップ オブジェクトが返されます。

with open(filename, 'rU') as fd:
    multiLine = fd.read()
    list(map(lambda x: x, multiLine))

マップ オブジェクトをリストに変換すると、アンパックする方法よりも時間がかかります。

于 2019-03-26T12:11:49.750 に答える