我必须在一个列表中搜索,并用另一个元素替换所有出现的元素。到目前为止,我在代码方面的尝试都没有取得什么进展,最好的方法是什么?

例如,假设我的列表有以下整数

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