我必须在一个列表中搜索,并用另一个元素替换所有出现的元素。到目前为止,我在代码方面的尝试都没有取得什么进展,最好的方法是什么?
例如,假设我的列表有以下整数
>>> a = [1,2,3,4,5,1,2,3,4,5,1]
我需要将所有出现的数字1替换为值10,所以我需要的输出是
>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
因此,我的目标是将数字1的所有实例替换为数字10。
我必须在一个列表中搜索,并用另一个元素替换所有出现的元素。到目前为止,我在代码方面的尝试都没有取得什么进展,最好的方法是什么?
例如,假设我的列表有以下整数
>>> a = [1,2,3,4,5,1,2,3,4,5,1]
我需要将所有出现的数字1替换为值10,所以我需要的输出是
>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
因此,我的目标是将数字1的所有实例替换为数字10。
当前回答
如果你有几个值需要替换,你也可以使用字典:
a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1]
replacements = {1:10, 2:20, 3:'foo'}
replacer = replacements.get # For faster gets.
print([replacer(n, n) for n in a])
> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10]
注意,这种方法仅在要替换的元素是可哈希的情况下才有效。这是因为字典键必须是可哈希的。
其他回答
列表理解工作得很好,使用enumerate进行循环可以节省一些内存(b/c操作基本上是在适当的位置完成的)。
还有函数式编程。参见map用法:
>>> a = [1,2,3,2,3,4,3,5,6,6,5,4,5,4,3,4,3,2,1]
>>> map(lambda x: x if x != 4 else 'sss', a)
[1, 2, 3, 2, 3, 'sss', 3, 5, 6, 6, 5, 'sss', 5, 'sss', 3, 'sss', 3, 2, 1]
在长列表和很少出现的情况下,使用list.index()比其他答案中给出的单步迭代方法快3倍左右。
def list_replace(lst, old=1, new=10):
"""replace list elements (inplace)"""
i = -1
try:
while True:
i = lst.index(old, i + 1)
lst[i] = new
except ValueError:
pass
我可能是个笨蛋,但我会为它写一个单独的简单函数:
def convertElements( oldlist, convert_dict ):
newlist = []
for e in oldlist:
if e in convert_dict:
newlist.append(convert_dict[e])
else:
newlist.append(e)
return newlist
然后根据需要调用它,如下所示:
a = [1,2,3,4,5,1,2,3,4,5,1]
a_new = convertElements(a, {1: 10})
## OUTPUT: a_new=[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
如果你有几个值需要替换,你也可以使用字典:
a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1]
replacements = {1:10, 2:20, 3:'foo'}
replacer = replacements.get # For faster gets.
print([replacer(n, n) for n in a])
> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10]
注意,这种方法仅在要替换的元素是可哈希的情况下才有效。这是因为字典键必须是可哈希的。
在迭代列表时,可以使用内置枚举来获得索引和值。然后,使用该值来测试条件,并使用索引替换原始列表中的该值:
>>> a = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]
>>> for i, n in enumerate(a):
... if n == 1:
... a[i] = 10
...
>>> a
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]