Python 动态删除数组中的元素并减小数组的大小
需要一个解决方案来修复在迭代元素时删除元素后的列表大小 无法创建新列表,因为这是一个更大问题(800次迭代)的问题,而且每次创建一个新列表的计算成本很高Python 动态删除数组中的元素并减小数组的大小,python,Python,需要一个解决方案来修复在迭代元素时删除元素后的列表大小 无法创建新列表,因为这是一个更大问题(800次迭代)的问题,而且每次创建一个新列表的计算成本很高 list=[1,2,3,4,5,6,7,8,9,10] 对于范围内的i(len(列表)): 如果a[i]=6,则lst中的x代表x) 对于g中的val: 打印(val) 首先,使用列表理解更容易: lst = [1,2,3,4,5,6,7,8,9,10] t = [x for x in lst if x >= 6] print(t) 如
list=[1,2,3,4,5,6,7,8,9,10]
对于范围内的i(len(列表)):
如果a[i]<6:
dela[i]
输出应该是原始列表,现在有值
[6,7,8,9,10]
首先,使用列表理解更容易:
lst = [1,2,3,4,5,6,7,8,9,10]
t = [x for x in lst if x >= 6]
print(t)
如果不允许创建新的列表
对象,则始终可以使用生成器表达式:
lst=[1,2,3,4,5,6,7,8,9,10]
g=(如果x>=6,则lst中的x代表x)
对于g中的val:
打印(val)
首先,使用列表理解更容易:
lst = [1,2,3,4,5,6,7,8,9,10]
t = [x for x in lst if x >= 6]
print(t)
如果不允许创建新的列表
对象,则始终可以使用生成器表达式:
lst=[1,2,3,4,5,6,7,8,9,10]
g=(如果x>=6,则lst中的x代表x)
对于g中的val:
打印(val)
只需覆盖当前列表
lst = [1,2,3,4,5,6,7,8,9,10]
lst =[i for i in lst if i>=6]
# lst = [6,7,8,9,10]
只需覆盖当前列表
lst = [1,2,3,4,5,6,7,8,9,10]
lst =[i for i in lst if i>=6]
# lst = [6,7,8,9,10]
有关性能度量,请参阅本答案末尾的更新
如果只从列表中删除一个元素(或列表开头的元素),则可能需要查找索引,而不是遍历所有元素:
index = lst.index(6)
del lst[:index]
如果在遍历列表时关注索引偏移,则可以跟踪已删除项的数量,并相应地计算实际索引:
originalLen = len(lst)
for originalIndex in range(originalLen):
i = originalIndex - originalLen + len(lst)
if lst[i] < 6:
del lst[i]
因此,制作新列表的“计算成本高”理论在实践中并不成立。与所有其他方法相比,它实际上是处理时间方面最经济的方法
这很可能是由COW(写时复制)内存管理引起的,它将在您更改列表中的某些内容时立即分配内存。因此,将始终创建一个新列表(内部)
通过自己显式创建一个新列表,您可以利用这个内存分配,并在列表的内存空间中保存任何额外的数据移动
总之,您应该让Python来处理这些问题。有关性能度量,请参阅本答案末尾的更新
如果只从列表中删除一个元素(或列表开头的元素),则可能需要查找索引,而不是遍历所有元素:
index = lst.index(6)
del lst[:index]
如果在遍历列表时关注索引偏移,则可以跟踪已删除项的数量,并相应地计算实际索引:
originalLen = len(lst)
for originalIndex in range(originalLen):
i = originalIndex - originalLen + len(lst)
if lst[i] < 6:
del lst[i]
因此,制作新列表的“计算成本高”理论在实践中并不成立。与所有其他方法相比,它实际上是处理时间方面最经济的方法
这很可能是由COW(写时复制)内存管理引起的,它将在您更改列表中的某些内容时立即分配内存。因此,将始终创建一个新列表(内部)
通过自己显式创建一个新列表,您可以利用这个内存分配,并在列表的内存空间中保存任何额外的数据移动
总之,您应该让Python来处理这些问题。一个安全的解决方案是向后迭代(如果修改一个可以在任何程度上被称为“安全”的迭代列表):
n=len(列表)
对于x范围内的i(n):
idx=n-i-1
如果列表[idx]<6:
删除列表[idx]
这样,您至少不会让更改影响列表中未更改的部分。安全的解决方案是向后迭代:
n=len(列表)
对于x范围内的i(n):
idx=n-i-1
如果列表[idx]<6:
删除列表[idx]
这样,您至少不会让更改影响列表中未更改的部分。什么是更改?识别代码要有逻辑性。在一次迭代中处理可变列表大小是没有意义的。我可以推荐使用其他库,如pandas/numpy,但最简单的方法是创建一个新的列表?识别代码要有逻辑性。在一次迭代中处理可变列表大小是没有意义的。我可以推荐使用其他库,如pandas/numpy,但最简单的方法是创建一个新列表。我添加了可能重复的注释,这更有意义(至少阅读问题)。此外,生成器表达式可能不是一个好主意,因为我假设OP需要多次迭代项目。只要您没有提出解决方案,您的评论就没有意义。根据原始问题设置的约束条件,指出建议的答案可能不起作用,这没有错。发表评论的人是否有自己的解决方案与此无关。我添加了更有意义的评论(至少阅读问题)。此外,生成器表达式可能不是一个好主意,因为我假设OP需要多次迭代项目。只要您没有提出解决方案,您的评论就没有意义。根据原始问题设置的约束条件,指出建议的答案可能不起作用,这没有错。评论人是否有自己的解决方案并不重要,因为OP存在每次创建新列表的处理复杂性问题,而不是内存效率问题,此解决方案仍具有与分配给新列表相同的追加操作数,因此可能不符合标准,因为OP存在每次创建新列表的处理复杂性问题,而不是内存效率问题,此解决方案的追加操作数与分配给新列表的追加操作数相同,因此它可能不符合标准Op不想添加更多内存约束,只需删除itemOP不想添加mo
for i,a in enumerate(lst):
if a is None: continue
if a > 2 and a < 5:
lst[i] = None
...
Method del 1 in 13 del only 1
---------------------------------- ----------- ----------
New list (using comprehension): 0.00650 0.00799
Assign None to deleted items: 0.00983 0.01152
Manually shifting elements: 0.01558 0.01741
Delete as you go in reverse order: 0.07436 0.00942
List of indexes to delete: 0.09998 0.01044