我必须搜索一个列表,然后用一个元素替换所有出现的元素。到目前为止,我在代码方面的尝试使我无处可寻,做到这一点的最佳方法是什么?
例如,假设我的列表具有以下整数
>>> 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。
Answers:
>>> a= [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]
>>> for n, i in enumerate(a):
... if i == 1:
... a[n] = 10
...
>>> a
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
a
对吧?我认为OP想要a
改变
a
应该变异的问题尚不清楚,但是(如Alekhya所示)在使用列表推导时处理这两种情况都是微不足道的。
a
则应该这样做a[:] = [4 if x==1 else x for x in a]
(请注意完整列表片段)。只需执行即可a =
创建一个a
与id()
原始列表不同(身份)的新列表
列表理解效果很好,使用enumerate循环可以节省一些内存(b / c操作实际上已就位)。
还有功能编程。查看地图用法:
>>> 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]
lambda
,map
被认为是非Python的。
如果您要替换多个值,则还可以使用字典:
a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1]
dic = {1:10, 2:20, 3:'foo'}
print([dic.get(n, n) for n in a])
> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10]
n
找不到,这不会抛出错误dic
吗?
n
找不到,它可以工作。我希望你不要介意。您的try/except
解决方案不好。
if n in dic.keys()
性能不好。使用if n in dic
或者dic.get(n,n)
(默认值)
>>> a=[1,2,3,4,5,1,2,3,4,5,1]
>>> item_to_replace = 1
>>> replacement_value = 6
>>> indices_to_replace = [i for i,x in enumerate(a) if x==item_to_replace]
>>> indices_to_replace
[0, 5, 10]
>>> for i in indices_to_replace:
... a[i] = replacement_value
...
>>> a
[6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6]
>>>
以下是Python 2.x中非常直接的方法
a = [1,2,3,4,5,1,2,3,4,5,1] #Replacing every 1 with 10
for i in xrange(len(a)):
if a[i] == 1:
a[i] = 10
print a
此方法有效。欢迎发表评论。希望能帮助到你 :)
我知道这是一个非常老的问题,并且有很多方法可以解决。我发现较简单的一种是使用numpy
包。
import numpy
arr = numpy.asarray([1, 6, 1, 9, 8])
arr[ arr == 8 ] = 0 # change all occurrences of 8 by 0
print(arr)
我的用例已替换None
为一些默认值。
我已经定时提出了解决此问题的方法,包括@kxr-using str.count
。
使用Python 3.8.1在ipython中测试代码:
def rep1(lst, replacer = 0):
''' List comprehension, new list '''
return [item if item is not None else replacer for item in lst]
def rep2(lst, replacer = 0):
''' List comprehension, in-place '''
lst[:] = [item if item is not None else replacer for item in lst]
return lst
def rep3(lst, replacer = 0):
''' enumerate() with comparison - in-place '''
for idx, item in enumerate(lst):
if item is None:
lst[idx] = replacer
return lst
def rep4(lst, replacer = 0):
''' Using str.index + Exception, in-place '''
idx = -1
# none_amount = lst.count(None)
while True:
try:
idx = lst.index(None, idx+1)
except ValueError:
break
else:
lst[idx] = replacer
return lst
def rep5(lst, replacer = 0):
''' Using str.index + str.count, in-place '''
idx = -1
for _ in range(lst.count(None)):
idx = lst.index(None, idx+1)
lst[idx] = replacer
return lst
def rep6(lst, replacer = 0):
''' Using map, return map iterator '''
return map(lambda item: item if item is not None else replacer, lst)
def rep7(lst, replacer = 0):
''' Using map, return new list '''
return list(map(lambda item: item if item is not None else replacer, lst))
lst = [5]*10**6
# lst = [None]*10**6
%timeit rep1(lst)
%timeit rep2(lst)
%timeit rep3(lst)
%timeit rep4(lst)
%timeit rep5(lst)
%timeit rep6(lst)
%timeit rep7(lst)
我得到:
26.3 ms ± 163 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
29.3 ms ± 206 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
33.8 ms ± 191 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
11.9 ms ± 37.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
11.9 ms ± 60.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
260 ns ± 1.84 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
56.5 ms ± 204 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
str.index
实际上,使用内部比任何手动比较都快。
我不知道测试4中的异常是否比使用更费力str.count
,差异似乎可以忽略不计。
请注意,map()
(测试6)返回迭代器而不是实际列表,因此测试7。
您可以在python中简单地使用列表理解:
def replace_element(YOUR_LIST, set_to=NEW_VALUE):
return [i
if SOME_CONDITION
else NEW_VALUE
for i in YOUR_LIST]
对于您的情况,要将所有出现的1替换为10,代码片段将如下所示:
def replace_element(YOUR_LIST, set_to=10):
return [i
if i != 1 # keeps all elements not equal to one
else set_to # replaces 1 with 10
for i in YOUR_LIST]