リストをインプレースでフィルタリングする必要があり、リストサイズが非常に大きい場合、list.remove()に基づく前の回答で説明したアルゴリズムは、計算の複雑さがO(n ^ 2)であるため、不適切な場合があります。 。この場合、次のno-sopythonic関数を使用できます。
def filter_inplace(func, original_list):
""" Filters the original_list in-place.
Removes elements from the original_list for which func() returns False.
Algrithm's computational complexity is O(N), where N is the size
of the original_list.
"""
# Compact the list in-place.
new_list_size = 0
for item in original_list:
if func(item):
original_list[new_list_size] = item
new_list_size += 1
# Remove trailing items from the list.
tail_size = len(original_list) - new_list_size
while tail_size:
original_list.pop()
tail_size -= 1
a = [1, 2, 3, 4, 5, 6, 7]
# Remove even numbers from a in-place.
filter_inplace(lambda x: x & 1, a)
# Prints [1, 3, 5, 7]
print a
編集:実際には、https ://stackoverflow.com/a/4639748/274937のソリューションは私のソリューションよりも優れています。それはよりpythonicであり、より速く動作します。したがって、ここに新しいfilter_inplace()の実装があります。
def filter_inplace(func, original_list):
""" Filters the original_list inplace.
Removes elements from the original_list for which function returns False.
Algrithm's computational complexity is O(N), where N is the size
of the original_list.
"""
original_list[:] = [item for item in original_list if func(item)]