呼び出しごとに複数の結果が予想されるため、ジェネレーター関数を使用するのが最適です。
def get_bad_results(person_results):
for i in person_results:
if i[1]>i[3] or i[1]<i[2]:
yield i[0]
またはジェネレーター式:
def get_bad_results(person_results):
return (i[0] for i in person_results if i[1]>i[3] or i[1]<i[2])
となることによって
test_results = [["White blood cells",8.5,2,7],
["Neutrophils",5.3,2.5,5],
["Red blood cells", 12.4, 9,15]]
for i in get_bad_results(test_results):
print i
print list(get_bad_results(test_results))
print ", ".join(get_bad_results(test_results))
出力を与える
White blood cells
Neutrophils
['White blood cells', 'Neutrophils']
White blood cells, Neutrophils
他の機能については、
def count_healthy(all_results):
counter = 0
for i in all_results:
if len(list(get_bad_results(i))) == 0:
counter += 1
return counter
あるいは単に
def count_healthy(all_results):
return sum(1 for i in all_results if len(list(get_bad_results(i))) == 0)
編集:
多くのget_bad_results()
場合、それをリストに変換すると、メモリを大量に消費する可能性があります。
したがって、代わりにlen(list(get_bad_results(i))) == 0
使用できます
def has_results(it):
"""Returns True if the iterator it yields any items."""
return next((True for _ in it), False)
その後
def count_healthy(all_results):
return sum(1 for i in all_results if not has_results(get_bad_results(i)))