2

arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...]たとえば、任意の長さの 1D 配列があります。

これをテキスト ファイル (スペースで区切られた整数/浮動小数点数) に出力して、7 つの要素ごとにテキスト ファイルの同じ行に出力するにはどうすればよいですか?

したがって、テキストファイルは次のようになります。

ライン1:1 2 3 4 5 6 7

2行目:8 9 10 11 12 13 14

4

8 に答える 8

4

あなたの質問は3つの部分に分けることができます:

  1. 任意のサイズのリストを特定の長さのチャンクに分割する方法
  2. 区切り文字としてスペースを使用してint/floatのリストを印刷する方法
  3. ファイルへの書き込み方法

任意のサイズのリストを特定の長さのチャンクに分割する

この回答grouperで説明されている方法を使用する:

import itertools

def grouper(n, iterable):
    it = iter(iterable)
    while True:
       chunk = tuple(itertools.islice(it, n))
       if not chunk:
           return
       yield chunk

任意の長さのリストを目的の長さのチャンクに簡単に分割できます。例えば:

>>> arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> for chunk in grouper(7, arr1): print chunk
... 
(1, 2, 3, 4, 5, 6, 7)
(8, 9, 10, 11, 12, 13, 14)
(15, 16)

区切り文字としてスペースを使用してint/floatのリストを印刷する

リストを文字列に結合する標準的な方法は、を使用することstring.join()です。ただし、これは文字列のリストに対してのみ機能するため、最初に各要素を文字列表現に変換する必要があります。これが1つの方法です:

>>> a = [1, 2, 3, 4]
>>> print " ".join(str(x) for x in a)
1 2 3 4

前の例でこのメソッドを使用すると、次のようになります。

>>> for chunk in grouper(7, arr1):
...   print " ".join(str(x) for x in chunk)
... 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16

それはほとんどあなたが望む出力です。今、私たちがする必要があるのは、それをファイルに書き込むことだけです。

ファイルへの書き込み

with open("outfile.txt", "w") as f:
  for chunk in grouper(7, arr1):
    f.write(" ".join(str(x) for x in chunk) + "\n")

詳細については、ファイルの読み取りと書き込みを参照してください。

于 2013-02-18T17:57:57.437 に答える
1
output=''
col = 0
for i in arr1:
    output +="%s " % i #write an element of the array to the output and append a space
    col += 1 #count the number of elements on the current line
    if col==7: #if 7 elements have been entered, append a new line and restart the count
        output += "\n"
        col = 0

f = open("filepath.txt",'w') #open a file (replace filepath.txt with the actual filename)
f.write(output) # write the output to the text file
f.close() #close the file object
于 2013-02-18T17:58:04.453 に答える
1
from itertools import imap
print '\n'.join((' '.join(imap(str, arr1[i*7:(i+1)*7])) for i in xrange((6+len(arr1))/7)))

または、

 groups_of_seven = (arr1[i*7:(i+1)*7] for i in xrange((6+len(arr1))/7))
 groups_of_seven_strings = (imap(str, i) for i in groups_of_seven)
 groups_of_strings = (' '.join(i) for i in groups_of_seven_strings)
 one_string = '\n'.join(groups_of_strings)

ネストされたjoins をizipテクニックと組み合わせる:

print '\n'.join((' '.join(j) for j in izip(*[imap(str, arr1)]*7)))
于 2013-02-18T17:45:02.730 に答える
1

zip次のイディオムを使用して、シーケンスをチャンクできます。

from itertools import izip

def chunk(seq, n):
    return izip(*[iter(seq)]*n)

その後、次のイテレータを作成できますwritelines

def chunkedlines(seq, n):
    for line in chunk(seq, 7):
        yield ' '.join(str(item) for item in line)
        yield "\n"

最後にそれを使用します:

from StringIO import StringIO
fp = StringIO('wb')

arr1 = range(1, 15)

fp.writelines(chunkedlines(arr1, 7))

print fp.getvalue()
于 2013-02-18T17:45:54.763 に答える
1

あなたはこれを行うことができます:

liNums = xrange(1, 20)
x = 0
line = ""
for i in liNums:
    x+=1
    line += "%s " % i
    if not x%7:
        line += "\n"
#send line to output, here I will just print it
print line

ここでは、7 項目ごとに新しい行が追加されます...出力は次のようになります。

1 2 3 4 5 6 7 
8 9 10 11 12 13 14 
15 16 17 18 19 

それが役立つことを願っています!

于 2013-02-18T17:29:49.403 に答える
1
>>> arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> for i in xrange(0,len(arr1),7):
...     print arr1[i:i+7]
... 
[1, 2, 3, 4, 5, 6, 7]
[8, 9, 10, 11, 12, 13, 14]

またはあなたがすることができます:

>>> arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> results = map(str,arr1)
>>> for i in range(0,len(arr1),7):
...     ','.join(results[i:i+7])
... 
'1,2,3,4,5,6,7'
'8,9,10,11,12,13,14'
于 2013-02-18T17:30:23.500 に答える
1

Python では、「ジェネレーター」と考えてください。

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,101,
      203,514,201,567,849]

gen = ('%-5s\n' % x if i%7==0 else '%-5s' %x
       for i,x in enumerate(li,1))

print ''.join(gen)

結果

1    2    3    4    5    6    7    
8    9    10   11   12   13   14   
101  203  514  201  567  849 

また、各行の数値の数をパラメーター化する場合は、ジェネレーター関数を作成します。

def yn(li,n):
    for i,x in enumerate(li,1):
        yield '%-5s ' % x
        if i%n==0:
            yield '\n'

print ''.join(yn(li,7))
于 2013-02-18T19:32:39.920 に答える
1
>>> [arr1[7 * i: 7 * i + 7] for i in range(0, 1 + len(arr1) / 7)]
[[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15]]

次に、このリスト (リストの) を反復処理して、それらをファイルに挿入するだけです。

于 2013-02-18T17:29:27.720 に答える