(08.20) 수정됨.
str object가 다수 들어있는 list[str] object가 있다고 가정하자.
그리고 나는 현재 이 list의 각 요소가 정확히 무엇이어야 하는지는 모르지만, 각 index 요소마다 어떤 문자열이 포함되어야만 하는지에 대해서는 알고 있다.
이런 경우 어떻게 해야 할까?
코드
대충 다음과 같이 하면 된다.
data = [
'가나다라',
'1234',
'abcd',
'가갸거겨',
'4321',
'xyz',
]
check_list = []
for d in data:
check = []
check += [all([s in d for s in ['가나', '나다']])]
check += [all([s in d for s in ['12', '34']])]
check += [all([s in d for s in ['b', 'cd']])]
check += [all([s in d for s in ['32', '1']])]
print(f'{d=}')
print(f'{check=}')
check_list.append(check)
checks = [any(check) for check in zip(*check_list)]
print(f'{checks=}')
if checks and all(checks):
print('조건을 만족함')
else:
print('조건을 만족하지 않음')
출력문
위 코드 작동시 출력문은 다음과 같다.
>> d='가나다라'
check=[True, False, False, False]
d='1234'
check=[False, True, False, False]
d='abcd'
check=[False, False, True, False]
d='가갸거겨'
check=[False, False, False, False]
d='4321'
check=[False, False, False, True]
d='xyz'
check=[False, False, False, False]
checks=[True, True, True, True]
조건을 만족함
원리는 *check_list로 check_list의 요소들을 arg로 묶어서 zip 명령에 전달하고, 각 요소들을 새롭게 묶는 것이다.
이 방법을 통해 리스트의 동일 인덱스를 묶는 것이 가능하다.
표와 비교하자면 표의 가로세로 행을 서로 변경하는 것이다.
# 기존 check_list
[0 1 2 3 4]
[0 1 2 3 4]
[0 1 2 3 4]
# zip으로 병합시킨 checks
[0 0 0]
[1 1 1]
[2 2 2]
[3 3 3]
[4 4 4]
코드 줄이기
다음과 같이 코드를 줄이는 것도 가능하다.
data = [
'가나다라',
'1234',
'abcd',
'가갸거겨',
'4321',
'xyz',
]
string_list = [
['가나', '나다'],
['12', '34'],
['b', 'cd'],
['32', '1']
]
check_list = [[all([s in d for s in strings]) for strings in string_list] for d in data]
checks = [any(check) for check in zip(*check_list)]
if checks and all(checks):
print('조건을 만족함')
else:
print('조건을 만족하지 않음')
인덱스 지정하기
리스트의 몇 번 인덱스에 부합해야하는 조건을 특정할 수 있다면, 다음과 같이 인덱스값을 추가하여 검사하는 것도 가능하다.
data = [
'가나다라',
'1234',
'abcd',
'가갸거겨',
'4321',
'xyz',
'zzz',
'111',
]
string_dict = {
0: ['가나', '나다'],
1: ['12', '34'],
2: ['b', 'cd'],
3: ['32', '1']
}
check_list = [strings and all([s in data[index] for s in strings]) for index, strings in string_dict.items()]
if check_list and all(check_list):
print('조건을 만족함')
else:
print('조건을 만족하지 않음')