Skip to content

Instantly share code, notes, and snippets.

@ryohji
Last active August 9, 2021 06:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryohji/c529c36138fcecb882d87452297eded1 to your computer and use it in GitHub Desktop.
Save ryohji/c529c36138fcecb882d87452297eded1 to your computer and use it in GitHub Desktop.
リストから不要な要素を取りのぞく方法
import unittest
def cleanup_list(list):
i = 0
while i < len(list): # pop のたびに list 長が変わる
elem = list[i]
if not elem.alive:
list.pop(i)
else:
i += 1 # pop しなかったときに限り進める
def cleanup_list2(list):
i = len(list)
while i: # i != 0 ならループ処理を実行
i -= 1 # 常に 1 減らす
elem = list[i]
if not elem.alive:
del list[i] # list 長は変わるがループ条件は不変
def cleanup_list3(list):
# 削除対象のインデックスを列挙し、逆順に要素を削除
for i in reversed([i for i, v in enumerate(list) if not v.alive]):
del list[i]
def cleanup_list4(list):
# 削除対象のオブジェクトを列挙し、要素を対象にして削除(インデックス不使用)
for v in [v for v in list if not v.alive]:
list.remove(v)
def cleanup_list5(list):
# 残す対象のオブジェクトでリストを置き換え
alives = [v for v in list if v.alive]
del list[:]
list.extend(alives)
class TestCase(unittest.TestCase):
def setUp(self):
self.mocks = [_Mock(v) for v in [True, False, False, True, False]]
def make_sure_result(self):
self.assertEqual([True, True], [v.alive for v in self.mocks])
def test_cleanup_list1(self):
cleanup_list(self.mocks)
self.make_sure_result()
def test_cleanup_list2(self):
cleanup_list2(self.mocks)
self.make_sure_result()
def test_cleanup_list3(self):
cleanup_list3(self.mocks)
self.make_sure_result()
def test_cleanup_list4(self):
cleanup_list4(self.mocks)
self.make_sure_result()
def test_cleanup_list5(self):
cleanup_list5(self.mocks)
self.make_sure_result()
def test_cleanup_list6(self):
self.mocks = [v for v in self.mocks if v.alive] # del, expand 操作を省略
self.make_sure_result()
def test_cleanup_list7(self):
self.mocks = list(filter(lambda v: v.alive, self.mocks)) # 内包表記を filter で
self.make_sure_result()
class _Mock:
def __init__(self, alive: bool):
self._alive = alive
@property
def alive(self):
return self._alive
def __repr__(self):
return f'<Mock {"alive" if self.alive else "DEAD"}>'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment