2

次のようなシナリオがあります。

a = ["file1","file2","file3","file1","file2","file1","file5"]
set_flag = 0
for i in range (len(a)):
    file_name = '%s.txt' %(a[i])
    file_write = open('%s'%(file_name),'w')

上記は機能し、ファイルを書き込みます。ただし、一部のファイル名が上記のリストに複数回表示されていても、file_write が 1 回だけ発生するようにするロジックを含めたいと考えています。複数のファイル書き込みがあってはなりません。たとえば、file1 が 4 回出現する場合は、1 回だけ書き込む必要があります。これにより、set_flag を「1」に設定して、コード内の任意の場所に file1 を書き込もうとすると、ファイルの書き込みをバイパスする必要があります。これを達成してそのようなフラグを設定する方法はありますか?

4

3 に答える 3

4

を使用するset()と、アイテムのコピーが 1 つだけ保存されます。

>>> a=["file1","file2","file3","file1","file2","file1","file5"]
>>> set(a)
set(['file3', 'file2', 'file1', 'file5'])

コードの場合、これにより順序も維持されます。

a=["file1","file2","file3","file1","file2","file1","file5"]
seen=set()
for file in a:               #you can iterate over a list itself
    if file not in seen:     #if file is not in the set then write 
       file_name= '%s.txt' %(file)
       file_write= open('%s'%(file_name),'w')
       seen.add(file)  #add file to seen
于 2013-05-03T10:49:37.510 に答える
1

セットは良いアイデアなので、リスト内の一意のファイル名を繰り返すだけです。また、使用しないでくださいrange(len(...))。その他のクリーンアップ:

a = ["file1","file2","file3","file1","file2","file1","file5"]
set_flag = 0
for file_name in set(a):
    file_write = open(file_name + '.txt', 'w')
于 2013-05-03T10:59:39.643 に答える
1

また、何らかの理由で出力ファイルを作成する順序が必要な場合は、OrderedDictを使用できます (2.7+):

for fname in OrderedDict.fromkeys(a):
    with open(fname, 'w') as fout:
        pass
于 2013-05-03T11:04:19.037 に答える