list のサブリストを別のサブリストに置き換えたいa
。このようなもの:
a=[1,3,5,10,13]
次のようなサブリストを取りたいとしましょう:
a_sub=[3,5,10]
そしてそれを
b_sub=[9,7]
したがって、最終結果は
print(a)
>>> [1,9,7,13]
助言がありますか?
In [39]: a=[1,3,5,10,13]
In [40]: sub_list_start = 1
In [41]: sub_list_end = 3
In [42]: a[sub_list_start : sub_list_end+1] = [9,7]
In [43]: a
Out[43]: [1, 9, 7, 13]
それが役立つことを願っています
リストのスライスでこれをうまく行うことができます:
>>> a=[1, 3, 5, 10, 13]
>>> a[1:4] = [9, 7]
>>> a
[1, 9, 7, 13]
では、ここでインデックスを取得するにはどうすればよいでしょうか。さて、最初のものを見つけることから始めましょう。一致するサブリストが見つかるまで項目ごとにスキャンし、そのサブリストの開始と終了を返します。
def find_first_sublist(seq, sublist, start=0):
length = len(sublist)
for index in range(start, len(seq)):
if seq[index:index+length] == sublist:
return index, index+length
これで置換を行うことができます。最初から開始し、最初に見つけたものを置換し、新しく完成した置換の後に別のものを見つけようとします。置換するサブリストが見つからなくなるまで、これを繰り返します。
def replace_sublist(seq, sublist, replacement):
length = len(replacement)
index = 0
for start, end in iter(lambda: find_first_sublist(seq, sublist, index), None):
seq[start:end] = replacement
index = start + length
うまく使用できるもの:
>>> a=[1, 3, 5, 10, 13]
>>> replace_sublist(a, [3, 5, 10], [9, 7])
>>> a
[1, 9, 7, 13]
to からスライスを取得し、サブリストをそれに割り当てる必要がありstart_index
ますend_index + 1
。
あなたができるのと同じように: - a[0] = 5
、同様にサブリストをあなたのに割り当てることができますslice
: - a[0:5]
-> からスライスを作成しますindex 0 to index 4
必要なのは、置き換えたいposition
のを見つけることだけです。sublist
>>> a=[1,3,5,10,13]
>>> b_sub = [9, 7]
>>> a[1:4] = [9,7] # Substitute `slice` from 1 to 3 with the given list
>>> a
[1, 9, 7, 13]
>>>
ご覧のとおり、substituted
サブリストはサブリストと同じ長さである必要はありませんsubstituting
。
実際、4 つの長さのリストを 2 つの長さのリストに、またはその逆に置き換えることができます。
これを行う別の方法を次に示します。この方法は、複数のサブリストを置き換える必要がある場合に機能します。
a=[1,3,5,10,13]
a_sub=[3,5,10]
b_sub=[9,7]
def replace_sub(a, a_sub, b_sub):
a_str = ',' + ','.join(map(str, a)) + ','
a_sub_str = ',' + ','.join(map(str, a_sub)) + ','
b_sub_str = ',' + ','.join(map(str, b_sub)) +','
replaced_str = a_str.replace(a_sub_str, b_sub_str)[1 : -1]
return map(int, replaced_str.split(','))
結果:
>>> replace_sub(a, a_sub, b_sub)
[1, 9, 7, 13]
>>> replace_sub([10, 13, 4], [3, 4], [7])
[10, 13, 4] #[3,4] is not in the list so nothing happens
複数のサブリストを置き換えます。
>>> a=[1,3,5,10,13,3,5,10]
>>> a_sub=[3,5,10]
>>> b_sub=[9,7]
>>> replace_sub(a, a_sub, b_sub)
[1, 9, 7, 13, 9, 7]