Python 动态删除数组中的元素并减小数组的大小

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) 如

需要一个解决方案来修复在迭代元素时删除元素后的列表大小

无法创建新列表,因为这是一个更大问题(800次迭代)的问题,而且每次创建一个新列表的计算成本很高

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