Last active
August 9, 2021 06:50
-
-
Save ryohji/c529c36138fcecb882d87452297eded1 to your computer and use it in GitHub Desktop.
リストから不要な要素を取りのぞく方法
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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