ディレクトリにさらに多くのファイルを作成する必要があるため、これをプログラムで実行したいと考えています。Pythonを選択しましたが、次の問題を解決する方法
私はリストを持っています
L=['a','b','c']
次に、リスト L のエントリを次のように変更します。
L=['a.txt','b.txt','c.txt']
どうやってするの?
ディレクトリにさらに多くのファイルを作成する必要があるため、これをプログラムで実行したいと考えています。Pythonを選択しましたが、次の問題を解決する方法
私はリストを持っています
L=['a','b','c']
次に、リスト L のエントリを次のように変更します。
L=['a.txt','b.txt','c.txt']
どうやってするの?
>>> L=['a','b','c']
>>> L[:] = [x + '.txt' for x in L]
>>> L
['a.txt', 'b.txt', 'c.txt']
スライスの割り当て[:]
は、L
それ自体を変更して参照を保持するために使用されます。例えば。使わないとこうなる
>>> L=['a','b','c']
>>> L2 = L # you may have a reference like this in your code somewhere
>>> L = [x + '.txt' for x in L] # this simply reassigns the name L to a new value
>>> L
['a.txt', 'b.txt', 'c.txt']
>>> L2 # but doesn't affect the name L2 which is still binded to the old list
['a', 'b', 'c']
リストを変更するには、インデックスを使用して反復します。
for i in range(len(L))):
L[i] += '.txt'
ただし、この場合、実際にリストを変更する必要はないため、@Ashwini Chaudhary が提案するように、リスト内包表記を使用することをお勧めします。ただし、リスト内包表記を使用すると新しいリストが作成されるため、それを L に再度割り当てることができます。
L = [s + '.txt' for s in L]
ただし、元の変数 L がグローバル変数または非ローカル変数である場合、上記のステートメントは新しいローカル変数を作成し、現在の関数の最後で消えるため、代入の前にアクセスしようとすると混乱が生じる可能性があります。
>>> L = ['a', 'b', 'c']
>>> def addtxt():
... print(L)
... L = [s + '.txt' for s in L]
...
>>> addtxt()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in addtxt
UnboundLocalError: local variable 'L' referenced before assignment
宣言を追加する必要がありますglobal
(または他の場合)。nonlocal
これを処理するのはきれいな方法ではありません。
したがって、インプレース置換とリスト内包表記を組み合わせると、@ Jamylak から提案が得られます。
L[:] = [s + '.txt' for s in L]
where[:]
は、リストの内容が割り当ての右側に置き換えられることを意味します。これはローカルバインディングを追加せず、上記のループが収まる場所ならどこにでも収まります。