Python列表问题

Posted

技术标签:

【中文标题】Python列表问题【英文标题】:Python list issue 【发布时间】:2011-12-16 07:56:32 【问题描述】:

我需要一些提示或示例,如何在列表a 中本地化列表b,然后将其替换为列表c

a=[1,3,6,2,6,7,3,4,5,6,6,7,8]

输入b 列表(这是程序在列表a 中搜索的子列表)。

b=[6,7]

当找到返回我的索引是子列表已经找到并每次用c=[0,0]替换它,所以结果将是

[1,3,6,2,0,0,3,4,5,6,0,0,8]

【问题讨论】:

【参考方案1】:

这是比我的第一个更有效的方法,使用列表切片:

>>> for i in xrange(len(a) - len(b) + 1):
...     if a[i:i+len(b)] == b:
...         a[i:i+len(b)] = c
... 
>>> a
[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]

第一次尝试,为了后代......

如果您不需要中间索引,这是一种方法,使用字符串函数并采用函数式方法,而不是就地修改列表。

>>> a_as_str = ','.join(str(i) for i in a)
>>> print a_as_str
1,3,6,2,6,7,3,4,5,6,6,7,8
>>> b_as_str = ','.join(str(i) for i in b)
>>> b_as_str
'6,7'
>>> c_as_str = ','.join(str(i) for i in c)
>>> c_as_str
'0,0'
>>> replaced = a_as_str.replace(b_as_str, c_as_str)
>>> replaced
'1,3,6,2,0,0,3,4,5,6,0,0,8'
>>> [int(i) for i in replaced.split(',')]
[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]

这可以重构为:

>>> def as_str(l):
...     return ','.join(str(i) for i in l)
... 
>>> def as_list_of_ints(s):
...     return [int(i) for i in s.split(',')]
... 
>>> as_list_of_ints(as_str(a).replace(as_str(b), as_str(c)))
[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]

【讨论】:

从整数到字符串再转换回来对我来说比直接搜索列表要清楚得多。这也有显着的性能损失(尽管在这种情况下可能不相关)。 这是超级可读和高效的,但这里有一个问题:替换正在就地完成,而步长可能(可能)小于替换大小。这有点棘手,因为您可能希望进行第一次有效替换。 @amicitas:谢谢。我不确定这是不是一个问题,因为替换 [0, 0] 和搜索 [6, 7] 没有重叠。【参考方案2】:

你可以做类似的事情(用python 3.2编写,在python 2.x中使用xrange):

for i in range(0, len(a)):
    if a[i:i+len(b)] == b:
        a[i:i+len(b)] = c

这将包含所有大小的列表。 这假设 list b == list c 我不知道这是否是您想要的,但是,如果不是,请说明。

列表的输出:

a = [1,2,3,4,5,6,7,8,9,0]
b = [1,2]
c = [0,0]
Output:
[0, 0, 3, 4, 5, 6, 7, 8, 9, 0]

【讨论】:

哦,哇,我什至没有看到列表 b,我将编辑答案。编辑:完成 对于问题中提供的a, b, c 的给定值,现在返回a 作为[1, 3, 0, 0, 0, 0, 3, 4, 5, 6, 0, 0, 8] 感谢您,在修复对齐错误时我造成了另一个错误,for 循环只测试了第一个值,现在我得到了您发布的解决方案 =d 解决了!我知道这一点是因为它现在和我的一样,只是你循环了一个索引。【参考方案3】:

我举个例子

li=[1,3,6,2,6,7,3,4,5,6,6,7,8]
for i  in range(len(li)): 
    if li[i:i + 2] == [3, 4]: 
        li[i:i + 2] = [0, 0]

我认为这段代码应该可以工作。如果您想要更健壮的脚本,我建议您检查原始列表中子字符串的出现情况并编辑副本(以避免副作用行为)。

【讨论】:

一些改进:使用op使用的变量名,可以使范围像range(len(a) - len(b));如果if a[i:i+len(b)] == b;作业a[i:i+len(b)] = c.【参考方案4】:

考虑当给定模式由替换创建时会发生什么也很重要。

我认为这个函数应该按预期处理所有情况:

def replace(a, b, c):
    ii = 0
    while ii <= (len(a) - len(b) + 1):
        print(ii)
        if a[ii:ii+len(b)] == b:
            a[ii:ii+len(b)] = c
            ii += len(b)
        else:
            ii += 1
    return a

使用原始示例的输出:

[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]

以下是替换创建搜索模式的示例:

a = [1,1,1,1,1,1,1,1,1,6,6,7,7,1]
b = [6,7]
c = [0,6]

输出如预期:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 0, 6, 7, 1]

关于如何更简洁地做到这一点的任何想法?

【讨论】:

以上是关于Python列表问题的主要内容,如果未能解决你的问题,请参考以下文章

python 元组、列表问题

将列表元素附加到python中的列表列表

通用列表到列表的 Python 转换 [str] (Python 2.7)

python列表方法

python把列表前几个元素提取到新列表

为啥 Python 列表在实现为动态数组时称为“列表”