24

我想a用另一个子列表替换 list 中的子列表。像这样的东西:

a=[1,3,5,10,13]

可以说我想要一个子列表,例如:

a_sub=[3,5,10]

并将其替换为

b_sub=[9,7]

所以最终结果将是

print(a) 
>>> [1,9,7,13]

有什么建议么?

4

4 回答 4

22
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]

希望有帮助

于 2012-10-15T14:44:45.150 回答
15

您可以通过列表切片很好地做到这一点:

>>> 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]
于 2012-10-15T14:49:39.553 回答
2

您需要从 to 中获取一个切片start_indexend_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

实际上,您可以用 2 长度列表替换 4 长度列表,反之亦然。

于 2012-10-15T14:44:02.043 回答
0

这是另一种方法。如果我们需要替换多个子列表,则此方法有效:

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]
于 2012-10-15T15:01:50.183 回答