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列表问题的主要内容,如果未能解决你的问题,请参考以下文章