TigerCow.Door


안녕하세요.

오늘은 mongoDB에서 데이터 자료형과 find함수, 쿼리연산자에 대해서 알아보도록 하겠습니다.

내용에 대한 피드백이나 궁금한 점은 언제든지 댓글을 남겨주세요 :)


1. 데이터 자료형(Datatypes)


MongoDB에는 많은 데이터 자료형을 지원합니다. 그 중 몇가지에 대해서만 알아보도록 하겠습니다.


String

 String은 데이터를 저장할때 가장 많이 사용되는 데이터 자료형 중 하나입니다. MongoDB에서 String은 반드시 UTF-8 형식만 가능합니다.

Integer

 숫자값을 저장할때 주로 사용되는 자료형입니다. Integer는 서버에 따라서 32bit 또는 64bit입니다.

Boolean

 이것은 참(true) 또는 거짓(false)를 나타내는 값을 저장하는 자료형입니다.

Double

 Double 자료형은 부동 소수점 값을 저장하는데 사용됩니다.

Min/Max keys

 이것은 BSON요소의 최저 값과 최고값을 비교하는데 사용됩니다.

Arrays

 Arrays 자료형은 배열 또는 여러 값을 하나의 키에 저장하는데 사용됩니다.

Timestamp

 해당 자료형은 문서가 수정되거나 추가될때 기록하기 편리합니다.

Object

 해당 자료형은 embedded documents에 사용됩니다.

Null

 Null 자료형은 Null 값을 저장할 떄 사용됩니다.

Symbol

 해당 자료형은 문자열(String)과 동일하게 사용됩니다. 하지만 일반적으로 특정 기호 유형을 사용하는 언어로 사용되고 있습니다.

Date

 Date 자료형은 현재의 날짜 또는 시간을 UNIX시간 형식으로 저장하는 데 사용됩니다. Date 객체를 만들어 내며 일, 월, 년을 전달하여 자신의 날짜 및 시간을 지정할 수 있습니다.

Object ID

 이것은 document의 ID를 저장하는데 사용됩니다.

Binary data

 이것은 2진수 데이터를 저장하는데 사용됩니다.

Code

 이것은 document 내부에 JavaScript 코드를 저장하는데 사용됩니다.

Regular expression

 이것은 정규 표현식을 저장하는데 사용됩니다.



2. Document 검색:: find() 함수


이번에는 Document를 검색하는 find() 함수에 대해서 알아보도록 하겠습니다.

먼저 find method에 대한 정의는 아래와 같습니다.


db.COLLLECTION-NAME.find(query,projection)


Parameter

Type

Description

query

document

Optional(선택적임).

검색시 보다 구체적인 내용을 반환받기 위해 조건을 입력. default로는 모든 값을 검색.

projection

document

Optional(선택적임).

검색후 반환 값(출력 값)을 어떤식으로 할지 결정함. default로는 모든 값을 출력. 


find는 위와 같은 구조를 가진 함수입니다. 그럼 바로 사용해볼까요?



위의 사진에서 순서대로 확인해보겠습니다.

먼저 사용할 데이터베이스를 선택하고, 어떠한 collection들이있는지 확인해보았습니다.

그리고 존재하는 firstCollection을 find()함수로 확인해보았습니다.

하나의 document가 존재하여 2개의 document를 추가하였습니다.

이후 find() 함수를 한번더 사용하였습니다.


이때, document가 한줄로 출력되서 보기 힘드신가요?

이러한 시각적 불편함을 해결하기위해 pretty() 함수가 있습니다.

함수이름대로, 보기좋게 document를 출력해주는 함수입니다.

아래 사진을 보시면 잘 이해가 가실거에요.



pretty() 함수를 사용하지 않았을떄와 사용했을떄의 차이가 보이시나요?



2-1. find() 함수 활용하기


find() 함수를 좀 더 응용해보도록 할게요.

기본적으로, collection에 있는 모든 다큐먼트를 조회하려면 어떻게 해야 할까요?

네. 맞습니다. 위에서 했던 것처럼,

db.COLLECTION-NAME.find()

를 입력하면 해당 컬렉션의 모든 document가 조회됩니다.


이제 몇가지 조건을 추가해볼게요.

위의 firstCollection을 바탕으로 하여, 성별(sex)가 남자(male)인 다큐먼트만 조회하려면 어떻게 해야할까요?

find() 함수의 정의에서 살펴본 것처럼, query parameter에 조건을 추가하면 되겠죠?


db.firstCollection.find({"sex":"male"})



한번 더 해보겠습니다.

그럼, 전공이 운동(sport)인 다큐먼트의 이름(name)을 조회하려면 어떻게 해야할까요?

네, 바로 query와 projection 두개다 적절히 조건을 추가하면 되겠습니다.


db.firstCollection.find({"major":"sport"},{"_id":false,"name":true})




3. 쿼리 연산자(Query operators)


이번에는 MongoDB에서 사용되는 쿼리 연산자(Query operators)에 대해서 살펴보겠습니다.

쿼리연산자는 위에서 알아본 find() 함수와 함께 응용되어 다양한 기능을 할 수 있습니다.

쿼리 연산자는 프로그래밍 언어에서 사용되는 비교(Comparison), 논리(Logical)등과 같은 다양한 종류의 연산자가 있습니다.

하나씩 살펴보기에 앞서, 연산자들에 대한 예제를 진행하기 위해서 기본 muck up data를 설정하겠습니다.


insert 코드는 아래와 같으며 그에 대한 muck up data를 find()함수로 확인하였습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
db.operatorTest.insert([
{
    "name":"John""sex":"male""major":"ECE""score":76"grade":"B"
},{
    "name":"Kai""sex":"male""major":"art""score":99"grade":"A"
},{
    "name":"Jane""sex":"female""major":"ECE""score":90"grade":"A"
},{
    "name":"Ko""sex":"male""major":"ECE""score":21"grade":"F"
},{
    "name":"Ki""sex":"female""major":"dance""score":79"grade":"B"
},{
    "name":"Bro""sex":"female""major":"art""score":68"grade":"C"
},{
    "name":"Victor""sex":"male""major":"ECE""score":49"grade":"D"
},{
    "name":"Kan""sex":"female""major":"art""score":61"grade":"C"
}
])
cs





3-1. 비교(Comparison)


연산자

설명(Description)

$eq

Matches values that equal to a specified value.

주어진 값과 동일한 값

$gt

Matches values that are greater than a specified value.

주어진 값보다 더 큰 값

$gte

Matches values that are greater than or equal to a specified value.

주어진 값보다 크거나 같은 값

$lt

Matches values that are than a specified value.

주어진 값보다 더 작은 값

$lte

Matches values that are less than or equal to a specified value.

주어진 값보다 작거나 같은 값

$ne

Matches all values that are not equal to a specified value.

주어진 값과 동일하지 않은 값

$in

Matches any of the values specified in an array.

주어진 배열에 속하는 어떤 값

$nin

Matches none of the values specified in an array.

주어진 배열에 속하지 않는 어떤 값


예제)

A) score의 값이 70이하이고, 45초과를 하는 document를 조회하여라.


query & result



B) grade가 [A,B,C,D]에 속하지 않는 document를 조회하여라.


query & result



C) major가 art인 document를 조회하여라.


query & result



3-2. 논리(Logical)


연산자

설명(Description)

$or

Joins query clauses with a logical OR returns all documents that match the conditions of either clause.

논리적 OR과 같은 의미로써, 주어진 조건 중 하나라도 true일때 true를 반환합니다.

$and

Joins query clauses with a logical AND returns all documents that match the conditions of both clauses.

논리적 AND와 같은 의미로써, 주어진 조건 중 모든 조건이 true일때 true를 반환합니다.

$not

Inverts the effect of a query expression and returns documents that do not match the query expression.

주어진 조건에 대해 반대 논리를 반환하는 것으로써, 주어진 조건이 false일때 true를 반환합니다.

$nor

Joins query clauses with a logical NOR returns all documents that fail to match both clauses.

주어진 조건 중 모든 조건이 false일때 true를 반환합니다.


예제)

A) 성별이 남자(male)이고 score가 50이하인 document를 조회하여라.


query & result



B) 전공(major)가 ECE가 아니고 score가 80미만이 아닌 document를 조회하여라.


query & result



C) 전공(major)가 ECE가 아니거나 score가 80미만이 아닌 document를 조회하여라.


query & result



3-3. 요소(Element)


연산자

설명(Description)

$exists

Matches documents that have the specified field.

주어진 필드를 가진 documents를 조회합니다.

$type

Selects documents if a field is of the specified type.

field가 지정된 유형인 경우 해당 documents를 선택합니다.



3-4. 평가(Evaluation)


연산자

설명(Description)

$mod

Performs a modulo operation on the value of a field and selects documents with a specified result.

field 값에 대한 modulo 연산을 수행하고 해당 결과가 있는 documents를 선택합니다.

$regex

Selects documents where values match a specified regular expression.

정규 표현식(regular expression)과 일치하는 documents를 선택합니다.

$text

Performs text search.

텍스트 검색을 수행합니다.

$where

Matches documents that satisfy a JavaScript expression.

JavaScript 표현식에 만족하는 documents를 조회합니다.



3-5. 배열(Array)


연산자

설명(Description)

$all

Matches arrays that contain all elements specified in the query.

query에 지정된 모든 요소를 포함하는 배열을 찾습니다.

$elemMatch

Selects documents if element in the array field matches all the specified $elemMatch conditions.

배열 field의 요소가 지정된 $elemMatch의 조건과 모두 일치하는 documents를 선택합니다.

$size

Selects documents if the array field is a specified size.

배열 field가 지정된 크기인 경우의 documents를 선택합니다.



네, 이렇게 해서 MongoDB에서 데이터 자료형과, find() 함수, 다양한 연산자에 대해서 알아보았습니다.

내용에 대한 피드백이나 궁금한 점은 언제나 댓글을 이용해주세요 :)

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc


안녕하세요. 문범우입니다.

이번포스팅에서는 명제 논리와 모형 점검 방식에 대해서 알아보도록 하겠습니다.


1. 명제 논리(Propositional logic)


1-1. 구문(Syntax)


명제 논리의 구문(syntax)은 허용되는 문장들을 정의합니다. 즉, 어떻게 문장을 구성해야 하는지를 이야기합니다.

하나의 문장, 원자적 문장(atomic sentence)은 하나의 명제 기호(proposition symbol)로 구성됩니다. 그리고 그러한 기호는 참(true)이거나 거짓(false)인 하나의 명제를 나타 냅니다. 예를 들어 P, Q, R, North 등이 명제 기호입니다.

이때, 항상 고정적 의미를 가진 명제가 있는데 자주 보셨듯이 True와 False 입니다. True는 항상 참인 명제이며 False는 항상 거짓인 명제입니다.

또한 우리는 간단한 문장들을 괄호와 논리 접속사(logical connective)로 연결해서 복합 문장을 만들 수 있습니다.

일반적인 접속사(연산자)는 아래와 같습니다.


 (부정)

부정(negation)이라고 부른다. 

리터럴(literal)은 원자적 문장 또는 원자적 문장의 부정인데, 전자를 긍정 리터럴(positive literal), 후자를 부정 리터럴(negative literal)이라고 부른다.

(논리곱)

논리곱 성분(conjunction) 이라고 부른다.

또는 연언문이라고 부른다.

(논리합)

논리합 성분(disjunction) 이라고 부른다.

또는 선언문이라고 부른다. 역사적으로는 '또는'을 뜻하는 라틴어 'vel'에서 비롯되었다.

(함의)

함의(implication) 또는 조건부 문장이라고 부른다.

또한 함의 문장을 규칙(rule)이나 if-then 문장이라고 부르기도 한다.

 (동치)

동치, 상호조건(biconditional)이라고 부른다.

문장들을 이러한 접속사(연산자)를 이용하여 복합 문장을 만들어 내면 그 또한 문장입니다.




1-2. 의미론(Semantics)


명제 논리의 구문을 살펴보았으니, 이제 명제 논리의 의미론을 살펴보도록 하겠습니다.

의미론(semantics)이란 특정 모형에 대한 문장의 진리를 결정하는 규칙들을 정의합니다. 명제 논리에서 모형은 모든 명제 기호의 진릿값(truth value), 즉 참(true) 또는 거짓(false)을 고정하는 역할만 합니다.


명제 논리의 의미론은 주어진 모형에 대해 임의의 문장의 진릿값을 계산하는 방법을 명시해야 합니다. 모든 문장은 원자적 문장과 위에서 본 다섯가지 접속사로 구성됩니다. 따라서 원자적 문장의 진릿값을 계산하는 방법과 각 접속사로 만들어지는 문장의 진릿값을 계산하는 방법을 명시해야 합니다.

원자적 문장에 대한 의미론은 다음과 같습니다.


- True는 모든 모형에서 참이고 False는 모든 모형에서 거짓이다.

- 다른 모든 명제 기호의 진릿값은 반드시 모형 자체에 명시되어 있어야 한다.


복합 문장에 대해서는 다섯 가지 규칙이 존재합니다.

이러한 규칙들은 임의의 모형 m 안의 임의의 문장 P와 Q에 대해 성립합니다.


P는 오직 m에서 P가 거짓일 때에만 참이다.

- P Q는 오직 m에서 P와 Q가 모두 참일 때에만 참이다.

- P Q는 오직 m에서 P 또는 Q가 참일 때에만 참이다.

- P Q는 m에서 P가 참이고 Q가 거짓이 아닌 한 참이다.

- P Q는 오직 m에서 P와 Q가 둘 다 참이거나 둘 다 거짓일 때에만 참이다.



이러한 규칙들은 복합 성분의 진릿값을 나열한 진리표(truth table)로 표현할 수 있습니다.



이러한 표를 이용하면 임의의 모형 m에 대한 임의의 문장 s의 진릿값을 간단한 재귀적 평가를 통해서 구할 수 있습니다.

즉, 아래와 같은 예시를 쉽게 참 또는 거짓을 구분할 수 있습니다.


논리곱, 논리합 등과 같은 논리 접속사에서는 일상적인 자연어로 이야기 할 때 다소 혼동되는 부분들이 있을 수 있습니다.

하나씩 살펴보도록 하겠습니다.


논리곱과 논리합, 부정의 진리표는 영어 문장에서의 해당 영어 단어 and, or, not의 의미를 잘 반영합니다. 그러나 헷갈리는 부분이 역시나 존재합니다.  라는 것은 P 또는 Q가 참일 때는 물론이고 둘 다 참일 때에도 참입니다. 하지만 단순히 or이라는 의미는 P 또는 Q가 참일 때 참이라는 의미만 가지고 있어서 헷갈릴 수 있습니다.

또한 이와는 다른 접속사인 '배타적 논리합(exclusive or, 줄여서 "xor")'은 두 논리합 성분이 모두 참일 때에는 거짓을 산출 합니다.

논리곱, 논리합, 부정은 크게 혼동되지는 않을 터이나 이제 설명드릴 함의와 같은 논리접속사에 대해서는 의미적으로 많은 혼동이 있을 수 있으니 천천히 이해하시길 바랍니다.


논리 접속사 (함의)에 대한 지리표는 언뜻 보면 "P가 Q를 함의한다" 또는 "만일 P이면 Q이다"라는 문장에 대한 우리의 직관적 이해와 잘 맞지 않는 것처럼 보입니다. 한 예시를 들어보도록 하겠습니다. 명제 논리에서는 P와 Q사이에 어떤 인과관계가 있어야 한다고 요구하지 않습니다. 즉, P와 Q사이에는 전혀 무관할 수 있습니다. "만일 5이 홀수이면 서울은 한국의 수도이다."는 일상 언어의 감각으로는 상당이 엉뚱합니다. 하지만 명제논리에서는 해당 복합 문장을 참이라고 말합니다.(통상적인 해석하에서) 복합 문장을 만들어 내는 각각의 문장에 대한 서로의 인과관계는 필요 없기 때문입니다.

또 다른 혼란스러운 점은, 전제가 거짓인 명제 논리 문장은 결론과는 무관하게 무조건 참입니다. 예를 들어, "만일 3이 짝수라면 범우는 똑똑하다."는 범우가 똑똑한지 똑똑하지 않은지와 상관없이 무조건 참인 문장입니다. 이상하게 느껴질지 모르겠지만, '만일 3이 짝수라면' 이라는 전제가 거짓이기 때문에 결론을 신경쓸 필요없이 해당 복합문장은 참이기 때문입니다.

이를 보다 의미적으로 쉽게 다가가기 위해서, PQ 라는 문장을 "만일 P가 참이면 나는 Q가 참이라고 주장한다. 참이 아니면 나는 어떠한 주장도 하지 않는다."라는 문장으로 생각하면 이해가 될 것 입니다. 이런 문장은 오직 P가 참이고 Q가 거짓일 때에만 거짓이기 때문입니다. 



1-3. 웜푸스 세계에서의 간단한 지식 기지


명제 논리의 구문과 의미론에 대해서 알아보았으니 이제 그것들을 기초로 하여 지난 포스트에서 살펴본, 웜푸스 세계의 지식 기지를 구축해 보도록 하겠습니다. 현재는 웜푸스 세계가 변하지 않는, 불변이(immutable) 측면들에 초점을 맞출 것이며 가변(mutable)적인 측면들은 나중에 살펴보겠습니다. 우선, 아래와 같은 명제 기호에 대한 정의를 가지고 시작하겠습니다.


는 만일 [x, y]에 구덩이가 있으면 참이다.

는 만일 [x, y]에 웜푸스가 있으면(죽음과 상관없이) 참이다.

는 만일 에이전트가 [x, y]에서 미풍을 지각하면 참이다.

는 만일 에이전트가 [x, y]에서 악취를 지각하면 참이다.


지난 포스트에서 우리는 (1,2)에 구덩이가 없음을 비공식적으로 유도하였습니다. 따라서 그에 해당 하는 문장인 을 공식적으로 유도하기 위해 명제 논리 문장들을 작성해 보도록 하겠습니다. Ri는 이후 편하게 문장을 사용할 수 있도록 문장에 각각의 문장을 나타냅니다.


- [1,1]에 구덩이가 없다.

   R1 : 


- 에이전트가 하나의 칸에 존재함 그 이웃칸에 구덩이가 있으면, 그리고 오직 그럴때에만 미풍을 지각할 수 있다.

   R2 : 

   R3 : 


- 앞의 문장들은 모든 웜푸스 세계에서 참이다. 이제 에이전트가 있는 특정한 세계에서 처음 방문한 두 칸에 대한 미풍 지각을 위한 문장들을 명시한다.

   R4 : 

   R5 : 


이렇게 하여 기본적인 지식 기지를 구축해 보았습니다.



1-4. 웜푸스 세계에서의 간단한 추리 절차(모형 점검 방식)


우리의 목표는 지식기지(KB)에서 KB|=a 인 문장 a가 존재하는지를 알아내는 것 입니다.

즉, 위에서 구축한 KB가 를 함축하는지 알아내야 합니다.

이를 알아내기 위해서 진행할 첫 번째 추리 알고리즘은 함축의 정의를 직접 구현하는, 모형 점검 접근방식의 알고리즘입니다.

다시말해 이번에 살펴볼 추리 절차는 모든 모형들을 나열하면서 이에 대해 지식 기지(KB)가 참인지 거짓인지 확인합니다. 그리고 지식 기지가 참인 모든 모형들에서 문장 a가 참인지 점검합니다. 


웜푸스 세계로 돌아 간다면 유관한 명제 기호는  입니다. 명제 기호가 총 7개 이므로 가능한 모형은 총 128개(2의 7승)입니다. 이를 전부 나열했을때 지식 기지가 참인 것을 확인하면 총 3가지의 모형을 볼 수 있습니다.



지식기지가 참이 되는 세가지 모형을 보면 우리가 알아내려한 가 참인 것을 알 수 있습니다. 따라서 (1,2)에는 구덩이가 없습니다. 반면 는 세가지 모형 중 둘에서는 참이고 하나에서는 거짓이므로 (2,2)에 구덩이가 있는지 없는지 알 수 없습니다.


이러한 추리 방법은 이전에 비공식적으로 (1,2)에 구덩이가 없다는 것을 추리한 것보다 보다 엄밀한 추리 방법입니다. 알고리즘에서 함축의 정의를 직접적으로 구현 하기때문에 건전합니다.(sound) 그리고 KB와 a에 대해 작동하고 반드시 종료되므로 완결적(complete) 입니다. 알고리즘이 반드시 종료된다는 것은, 확인할 모형의 개수가 유한하기 때문입니다.


하지만 확인할 모형의 개수가 유한하다는 것은 '적다'라는 의미와는 다릅니다. KB와 a의 기호가 총 n개 일떄 확인해야 할 모형은 총 2^n개 입니다. 따라서 알고리즘의 시간 복잡도는 O(2^n)입니다. 그렇다면 보다 많은 경우에서 우리가 확인한 것보다 더 많은 모형을 확인해야 할 것입니다. 따라서 우리는 훨씬 효율적인 알고리즘들을 뒤에서 살펴보겠습니다.


아래는 표준적인 논리 동치 관계들을 나타내는 것으로써 각각의 문장들로 인한 복합문장들의 참 또는 거짓을 구별할 때 사용됩니다.


이렇게 하여 명제 논리와 모형 점검 방식에 대해 알아보았습니다.

다음 포스팅에서는 정리 증명(theorem proving)을 이용해서 함축 관계를 확인하는 방법을 살펴보도록 하겠습니다.

궁금한 점이나 내용에 대한 피드백은 댓글을 이용해주세요 :)



블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

안녕하세요.

오늘은 파이썬에서 문자열 인덱싱(indexing)과 슬라이싱(slicing)에 대해서 알아보겠습니다.

궁금하시거나 오류에 부딪히신 분은 언제든 댓글에 남겨주시면 최대한 답변드리겠습니다 :)


1. 문자열 인덱싱(Indexing)


인덱싱이란 말이 뭘까요?

인덱싱이라는 것은 무엇인가를 '가리킨다'는 의미입니다.

다시 말해서 긴 문자열에서 어떤 글자나 특정 위치를 가리키는 것을 말합니다.



위의 사진과 같이 a에 저장된 'Hello, python world!!'라는 문자열에서 각 문자마다 번호를 매겨 보겠습니다.


H

e

l

l

o

,

 

p

y

t

h

o

n

 

w

o

r

l

d

!

!

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20


처음 시작하는 글자 H를 0이라는 번호에서 시작하여 ! 문자까지 다 번호를 매겨보았습니다.

그렇다면 위의 문자열에서 o는 몇 번 위치에 있을까요?

네, 위의 표에서 확인할 수  있듯이 o라는 문자는 4번, 11번, 15번 위치에 있습니다.

그럼 a라는 변수에 저장된 문자열에서 12번 위치에 있는 글자는 무엇일까요?

네, 바로 n이라는 문자가 표에서 확인할 수 있듯이 12번 위치에 있습니다.


이러한 것이 문자열 인덱싱입니다.

파이썬에서도 이러한 인덱싱을 지원하고 있습니다. 아래 사진을 통해 살펴볼까요?



여기서 주의해야 할 점은, 표에서도 볼 수 있지만 파이썬에서는 0부터 숫자를 세는 점 입니다.



1-1. 문자열 인덱싱 활용하기


위에서 알아본 바와 같이, a[9]라는 것은 a라는 문자열에서 9번위치를 말합니다.

즉, 몇가지 예시를 본다면 아래 사진과 같습니다.



그런데, [ ]여기 안에 음수를 넣으면 어떻게 될까요?

a[-1] 또는 a[-5]는 무엇을 반환할까요?



위의 사진에서 볼 수 있듯이 a[-1]은 a라는 문자열에서 뒤에서 첫번째 문자를 말하고 a[-5]는 뒤에서 다섯번째 문자를 말합니다.


즉, 표로 정리해 본다면 다음과 같습니다.


H

e

l

l

o

,

 

p

y

t

h

o

n

 

w

o

r

l

d

!

!

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

-21

-20

-19

-18

-17

-16

-15

-14

-13

-12

-11

-10

-9

-8

-7

-6

-5

-4

-3

-2

-1



2. 문자열 슬라이싱(Slicing)


인덱싱은 무엇인가를 가리키는 것을 말한다고 하였습니다. 그럼 슬라이싱은 무엇일까요?

문자열 슬라이싱은 특정 문자열에서 무엇인가를 잘라내는 것 입니다.


위에서 보았던 문장을 가져와보도록 하겠습니다.

'Hello, python world!!' 라는 문자열에서 하나의 문자만 뽑아내는 것이 아니라 world라는 단어를 뽑아내는 방법은 없을까요?

바로 아래와 같이 하면 될 것 입니다.



그런데 위의 방식으로 긴 단어를 뽑아낸다면..? 생각보다 많이 불편할 수도 있습니다.

그래서 파이썬은 위의 방법보다 더 간편하고 좋은 방법을 내장하고 있습니다.

그것이 바로 파이썬에서 슬라이싱(Slicing)이라고 부르는 것입니다.

자세한 설명을 하기 앞서, 위에서 뽑아낸 world라는 단어를 슬라이싱으로 통해 다시 확인해보겠습니다.



처음에 적었던 긴 코드보다 더욱 짧아진 코드로 'world'라는 단어가 출력된 것을 확인할 수 있습니다.

그럼 a[14:19]라는 것이 의미하는 것은 무엇일까요?

결과를 통해 유추해본다면, 14번째부터 19번째까지 문자를 출력하는 것?..

비슷하지만 정확한 의미는, 'a라는 문자열에서 14번째위치의 문자부터 19번째위치의 앞의 문자까지 출력해!' 입니다.

즉, a[시작번호:끝번호] 로써 입력하면 시작번호부터 끝번호 앞의 문자까지, 끝번호의 문자는 제외하고 출력됩니다.

몇 개의 예시를 살펴보면 아래와 같습니다.




2-1. 문자열 슬라이싱 활용하기


문자열 슬라이싱을 할때 일반적으로 a[시작번호:끝번호]를 적어야하지만, 꼭 시작번호와 끝번호를 적어야 할 필요는 없습니다.

슬라이싱을 할때 끝번호를 생략하면 시작번호부터 그 문자열의 끝까지 출력합니다.




비슷한 개념으로, 슬라이싱을 할때 시작번호를 생략하면 그 문자열의 처음부터 끝번호의 앞의 문자까지 출력합니다.




그럼, 시작번호와 끝번호 모두 생략하면 어떻게 될까요?

네, 해당 문자열의 처음부터 끝까지를 출력합니다. 즉, a == a[:] 입니다.




또한 문자열 슬라이싱에서도 인덱싱과 마찬가지로 음수를 사용할 수 있습니다.



위의 사진에서 a[3:-3]은 a[3]부터 a[-4]까지 출력되는 것이며

a[10:-5]는 a[10]부터 a[-6]까지 출력되는 것입니다.





3. 문자열 인덱싱과 슬라이싱을 활용한 예제


마지막으로 위에서 배운 인덱싱과 슬라이싱기법을 이용한 간단한 예제를 확인하겠습니다.

사용자에게 주민등록번호 앞자리 7글자를 입력받아서

~년 ~월 ~일에 태어났고, 성별은 어떻게 되는지 출력하는 프로그램을 설계합니다.

즉, 아래 사진과 같은 결과가 출력되면 됩니다.




코드는 바로 아래에 첨부합니다.


꼭 직접 구현해보시기를 바랍니다 :)




1
2
3
4
5
6
7
8
9
10
11
12
13
14
# koreaRRN.py
# 사용자에게 주민번호 7글자를 입력받아서 결과 출력하기
# Tigercow.Door
print("주민번호 앞에서부터 7글자를 입력하세요.")
RRN = input()
year = RRN[0:2]
month = RRN[2:4]
day = RRN[4:6]
sex = RRN[6]
print("입력하신분께서는 19%s년 %s월 %s일에 태어나셨고, "%(year, month, day),end='')
if (sex == '1'):
    print ("성별은 남자입니다.")
else:
    print ("성별은 여자입니다.")
cs







* 참고

점프 투 파이썬(https://wikidocs.net/book/1)


이렇게 해서 이번 포스팅에서는 파이썬에서 문자열 인덱싱과 슬라이싱에 대해서 알아보았습니다.

다음 포스팅에서는 파이썬의 문자열 포매팅과 문자열 관련 함수들에 대해서 알아보겠습니다.


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc