1

次のリスト内包表記を行うと、ネストされたリストになります。

channel_values = [x for x in [ y.split(' ') for y in
    open(channel_output_file).readlines() ] if x and not x == '\n']

基本的に私はこれで構成されたファイルを持っています:

7656 7653 7649 7646 7643 7640 7637 7634 7631 7627 7624 7621 7618 7615
8626 8623 8620 8617 8614 8610 8607 8604 8600 8597 8594 8597 8594 4444
<snip several thousand lines>

このファイルの各行は新しい行で終了します。

基本的に、各番号(すべて1つのスペースで区切られています)をリストに追加する必要があります。

リスト内包を介してこれを行うためのより良い方法はありますか?

4

6 に答える 6

17

これにはリスト内包表記は必要ありません。

channel_values = open(channel_output_file).read().split()
于 2009-11-12T17:49:51.050 に答える
6

これを行うだけです:

channel_values = open(channel_output_file).read().split()

split()は、 を含む空白に従って分割されます' ' '\t' and '\n'。すべての値を 1 つのリストに分割します。

整数値が必要な場合は、次のことができます。

channel_values = map(int, open(channel_output_file).read().split())

またはリスト内包表記で:

channel_values = [int(x) for x in open(channel_output_file).read().split()]
于 2009-11-12T17:50:20.600 に答える
2

また、元のリスト内包表記がネストされたリストを持っていた理由は、内側の角括弧のセットを使用して追加レベルのリスト内包表記を追加したためです。あなたはこれを意味しました:

channel_values = [x for x in y.split(' ') for y in
    open(channel_output_file) if x and not x == '\n']

他の答えは、コードを記述するためのより良い方法ですが、それが問題の原因でした。

于 2009-11-12T18:03:37.390 に答える
1

ぶら下がっているファイル参照を気にせず、リストを一度にメモリに読み込む必要がある場合は、他の回答で言及されているワンライナーが機能します。

channel_values = open(channel_output_path).read().split()

本番コードでは、おそらくジェネレーターを使用しますが、それらが必要ないのに、なぜこれらすべての行を読むのでしょうか?

def generate_values_for_filename(filename):
    with open(filename) as f:
        for line in f:
            for value in line.split():
                yield value

値の反復処理以外のことを本当に行う必要がある場合は、後でいつでもリストを作成できます。

channel_values = list(generate_values_for_filename(channel_output_path))
于 2009-11-13T02:38:25.960 に答える
0

リストの理解を介してこれを行うより良い方法はありますか?

一種の..

各行を配列として読み取る代わりに、.readlines()メソッドを使用して、次を使用できます.read()

channel_values = [x for x in open(channel_output_file).readlines().split(' ')
if x not in [' ', '\n']]

より複雑なことを行う必要がある場合、特に複数のリスト内包表記が含まれる場合は、ほとんどの場合、通常のforループに展開する方が適切です。

out = []
for y in open(channel_output_file).readlines():
    for x in y.split(' '):
        if x not in [' ', '\n']:
            out.append(x)

または、for ループとリスト内包表記を使用します。

out = []
for y in open(channel_output_file).readlines():
    out.extend(
        [x for x in y.split(' ')
        if x != ' ' and x != '\n'])

基本的に、リスト内包表記だけでは何かできない (または入れ子にする必要がある) 場合、リスト内包表記はおそらく最善の解決策ではありません。

于 2009-11-12T18:12:48.853 に答える
0

もう 1 つの問題は、ファイルを開いたままにしておくことです。openのエイリアスであることに注意してくださいfile

これを試して:

f = file(channel_output_file)
channel_values = f.read().split()
f.close()

それらは文字列値になることに注意してください。整数値が必要な場合は、2行目を次のように変更します

channel_values = [int(x) for x in f.read().split()]

int(x) はValueError、ファイルに整数以外の値がある場合にスローします。

于 2009-11-12T17:56:12.100 に答える