0

for row in purge_list:リスト内包表記を使用して、正常に機能する次の例を1行に変換できるかどうか疑問に思っています。

fnam = "purge_list.csv"
fH = open(fnam, 'w+')

out_str = ""

for row in purge_list:
    for str_element in row:
        out_str = str(str_element) + "," + out_str

    out_str = out_str + "\n"
    fH.write(out_str)
    out_str = ""

fH.close()

私の目標は、リストで返された結果を取得し、それらをコンマ区切りの文字列として書き出すことです。

ありがとう。

編集

データは次のようになります。

Device ID   Last Read   PremiseID   
80622121    2011-12-05 23:00:00 304096000   
80630175    2012-04-25 23:09:46 315080000   
80623426    2012-04-25 23:00:00 601012500   
80622084    2012-07-31 23:00:00 604013000   
80581425    2012-07-31 23:00:00 604034000

この回答、コメント、回答にご注目いただきありがとうございます。

4

4 に答える 4

2

あなたの編集に応じて - これはそれを行うためのやや扱いやすい方法です:

FH.writelines([','.join(str(x) for x in reversed(row)) for row in purge_list])

しかし、それでも読むのはかなり難しいです。joinandを使用して内側のループを取り除くだけですreversed

于 2012-08-02T18:26:03.037 に答える
1

はい:

>>> purge_list = [ ["a","b"], ["c","d"] ]
>>> ",".join( reversed( [ str(element) for row in purge_list for element in row  ]) )
'd,c,b,a'

注意します:

  • 文字列のjoin()メソッドは、渡されたリスト内の各要素の間にその文字列を区切り文字として配置します
  • リスト内包表記は入​​れ子にすることができますが、それは裏返しに解釈されるため、直観に反する人もいます (私も含めて)
  • あなたのコードは、新しい要素を文字列の先頭に配置していました。これは、結合の前にリストを逆にすることで実現しました
于 2012-08-02T18:08:03.507 に答える
1
csv='\n'.join([','.join(map(str,row)) for row in purge_list])

もちろん、マップを別の文字列内包表記に置き換えることもできますが、マップの方が簡単だと思います。

編集:コードの逆行を見逃しました。だから、FJの答えは正しいものです。

再度編集: 末尾の改行 (最終行の後の改行) を取得するには、次のコードを使用します。

csv=['%s\n' % line for line in [','.join(map(str,row)) for row in purge_list]]

withステートメントを使用したコードに相当するものは次のとおりです。

with open(fnam, 'w+') as file:
    file.writelines('%s\n' % line for line in [','.join(map(str,row)) for row in purge_list])
于 2012-08-02T18:19:35.747 に答える
1

以下はあなたが望むことをするべきだと思います。あなたが探している結果でない場合は、いくつかの入力例と期待される出力を提供してください:

out_str = '\n'.join(','.join(map(str, reversed(row))) for row in purge_list)

あなたのコードは各行を順番に出力するように見えますが、各行の要素は逆になり、コンマで結合されます。これは私のコードが行うべきことです。

コードが行うもう 1 つのこと (これは意図的ではないと思います) は、いくつかの行の重複を出力することです。

','.join(map(str, reversed(row)))内側の for ループと同等です (末尾のコンマが含まれることを除いて)。これをfor row in purge_listジェネレーターの内部に配置することで、各行の正しい出力を取得し、'\n'.joinすべての行から 1 つの大きな文字列を作成するために使用されます。末尾の改行も必要になる場合があります。これ+ '\n'は、ワンライナーの最後に追加することで実行できます。

編集:何も元に戻したくない場合はreversed()、上記の呼び出しを削除してください。

于 2012-08-02T18:20:17.667 に答える