2023-04-27 TIL

0v0baek·2023년 4월 27일
0

TIL

목록 보기
39/92

[Python] 이차원 배열

그림 출처

이차원 배열이란, 간단하게 말하면 배열(list etc..)안에 배열이 들어가있는 것을 말한다!

다차원 배열은 배열 안에 배열이 들어가있는 형식이다.

# 1차원 배열
1d_array = [1, 2, 3, 4]

# 2차원 배열
2d_array = [[1, 2], [3, 4], [5, 6]]

# 3차원 배열
3d_array = [[[1, 2],[3, 4]], [[5, 6],[7, 8]]]

더 간단하게 말하면 겉 껍데기 개수n차원의 n에 해당된다!!

불러올 땐 이런식으로 부르면 된다.

# 1차원 배열 호출
1d_array[3] # 4

# 2차원 배열 호출
2d_array[1][2] # 4

# 3차원 배열 호출
3d_array[0][1][1] # 4

[programmers] 특별한 이차원 배열 1

n = 3

answer = [[0] * n]*n
print(answer) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
answer[0][0] = 1
print(answer) # [[1, 0, 0], [1, 0, 0], [1, 0, 0]]
answer[1][1] = 1
print(answer) # [[1, 1, 0], [1, 1, 0], [1, 1, 0]]

for 문을 사용하지 않고 이차원 배열을 생성하고 싶어서 곱하기로 만들어봤는데, 이상하게 요소가 한번에 변경이 안됐다!!

문제가 뭔가 싶어서 확인해 봤더니,
내가 한 방식은 아래와 같다...

1차원 배열을 복사하는 것이 아니라 1차원 배열의 주소를 복사합니다. 즉, 내부적으로는 1차원 배열이 하나만 존재하며, 이에 대한 주소만 n개의 변수에 저장되는 것입니다

그러니까,

answer = [[0] * n for _ in range(n)]

이런식으로 바꿔줘야 주소만 복사되지 않고 새 배열로 복사되는 것!!

[Python] pip list requirements.txt로 관리

pip에 있는 라이브러리를 전부 삭제하고 싶을 때!

>pip freeze > requirements.txt
>pip uninstall -r requirements.txt -y

이렇게 순서대로 입력하면 된다.

혹시나 requirements.txt에 있는 패키지를 설치하고 싶다면,

>pip install -r requirements.txt

이렇게 해주면 된다

[drf] "Invalid data. Expected a dictionary, but got User."

# views.py

class ArticleView(APIView):
    def post(self, request):
        serializer = ArticleCreateSerializer(data=request.user)
        print(serializer)
        if serializer.is_valid():
            serializer.save(author=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

이렇게 post로 글을 작성 후 저장하는 함수를 만들었다.
근데 Invalid data. Expected a dictionary, but got User. 라는 오류가 뜨면서 작동이 안된다...

시도 한 것들

터미널에 Bad Request: /articles/라고 뜨는 걸 보면 valid가 잘 안되는 것 같은데...

일단 어디서 막히는 지 확인하기 위해서 print문으로 중간중간 체크를 해줬다.

# views.py

print(serializer)
        if serializer.is_valid():
            print('valid 성공!')
            serializer.save(author=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            print('valid 실패...')
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

확인해보니까 첫 번째 줄까지는 잘 됨. is_valid()에서 안 넘어가는 것 같다.

문제점 발견!!

# serializers.py
class ArticleCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ("title", "image", "content", "author")

아니!!!
post 하위의 serializervalid를 체크할 때, author를 받지 않아야 넘어가는데 author을 넣어놔서 안되는 거였다!!

추가로,

class ArticleView(APIView):
    def post(self, request):
        serializer = ArticleCreateSerializer(data=request.user)

이 부분에서 request.user가 아닌 request.data로 해줘야 들어온 값들을 전부 받아올 수 있다... 유의하자!!!

[Python] dir()

참고 링크

네임 스페이스에 등록되어 있는 모든 이름들을 리스트로 반환해준다.

또한, 특정 무언가에서 사용 가능한 기능들을 확인할 수 있기도 하다.

dir([]) # 리스트에서 사용 가능 한 기능 출력
dir(math) # 특정 모듈에서 사용할 수 있는 기능을 출력하기도 한다.
profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!

0개의 댓글