20000 목록으로 구성된 목록이 있습니다. 각 목록의 세 번째 요소를 플래그로 사용합니다. 적어도 하나의 요소 플래그가 0 인 한이 목록에서 일부 작업을 수행하고 싶습니다.
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
처음에는 모든 플래그가 0입니다. while 루프를 사용하여 하나 이상의 요소 플래그가 0인지 확인합니다.
def check(list_):
for item in list_:
if item[2] == 0:
return True
return False
check(my_list)
반환 하면 True
목록에서 계속 작업합니다.
while check(my_list):
for item in my_list:
if condition:
item[2] = 1
else:
do_sth()
사실, my_list에서 반복 할 때 요소를 제거하고 싶었지만 반복 할 때 항목을 제거 할 수 없습니다.
원래 my_list에는 플래그가 없었습니다.
my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]
반복하면서 요소를 제거 할 수 없으므로이 플래그를 발명했습니다. 그러나이 my_list
항목에는 많은 항목 이 포함되어 있으며 while
루프는 각 for
루프 에서 모든 항목을 읽고 많은 시간을 소비합니다! 의견 있으십니까?
답변
여기서 가장 좋은 대답은 all()
이 상황에 내장 된를 사용 하는 것입니다. 이를 생성기 표현식 과 결합하여 원하는 결과를 깨끗하고 효율적으로 생성합니다. 예를 들면 다음과 같습니다.
>>> items = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
True
>>> items = [[1, 2, 0], [1, 2, 1], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
False
참고 all(flag == 0 for (_, _, flag) in items)
로 직접 동등은 all(item[2] == 0 for item in items)
,이 경우 읽을 조금 좋네요.
필터 예제의 경우 목록 이해 (물론 적절한 경우 생성기 표현식을 사용할 수 있음) :
>>> [x for x in items if x[2] == 0]
[[1, 2, 0], [1, 2, 0]]
적어도 하나의 요소가 0인지 확인하려면 any()
더 읽기 쉬운 옵션을 사용 하는 것이 좋습니다 .
>>> any(flag == 0 for (_, _, flag) in items)
True
답변
목록의 항목이 조건을 위반하는지 확인하려면 all
다음을 사용하십시오 .
if all([x[2] == 0 for x in lista]):
# Will run if all elements in the list has x[2] = 0 (use not to invert if necessary)
일치하지 않는 모든 요소를 제거하려면 filter
# Will remove all elements where x[2] is 0
listb = filter(lambda x: x[2] != 0, listb)
답변
itertools의 이와 같은 것을 사용할 수 있습니다. 조건이 충족되면 명령문이 실패합니다. 반대 방법은 떨어질 것입니다
for x in itertools.takewhile(lambda x: x[2] == 0, list)
print x
답변
사용하는 또 다른 방법 itertools.ifilter
. 이것은 진실성과 프로세스를 검사합니다 (을 사용하여 lambda
)
견본-
for x in itertools.ifilter(lambda x: x[2] == 0, my_list):
print x
답변
이 방법은 다음을 사용하는 것보다 약간 더 유연합니다 all()
.
my_list = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
all_zeros = False if False in [x[2] == 0 for x in my_list] else True
any_zeros = True if True in [x[2] == 0 for x in my_list] else False
간결하게 :
all_zeros = not False in [x[2] == 0 for x in my_list]
any_zeros = 0 in [x[2] for x in my_list]