프로그래밍/Python

Python - ','구분 없는 리스트 형태의 문자열을 리스트로 바꾸기(str -> list)(str에 저장되어있는 list를 list로 바꾸기)

꿈꾸는 사람_Anthony 2021. 1. 3. 04:00
반응형

간혹 [1,2,[3,4,]]와 같은 리스트가 list형태가 아닌, str형태로 저장되어있을 떄가 있다.

주로, 데이터를 txt로 저장하여 다른 프로그램에서 그것을 참조하거나, 협업 프로젝트에서 서로의 데이터를 주고받을 때 그런 현상이 나타난다. 이외에도 다양한 상황에서 이러한 문제가 발생한다.

 

이럴때 list형태로 다시 바꾸어야지 원하는 형태로 사용가능하다.

간단하게 json모듈, ast모듈을 사용해서 이것을 수행할 수 있으나,

간혹 데이터가 여러 리스트들이 ','(comma)구분없이 들어올 때가 있다.

이 경우, 직접 이 각 리스트들의 끝을 직접 찾아서 바꾸어주어야 하는 번거로움이 생긴다.

 

필자 또한 이러한 문제에 직면했다. 그리고 데이터 양이 하나에 100mb가 넘어가는 것을 보고 직접하는 것을 포기하고 이를 대신 수행해줄 함수를 제작하였다. 다음 코드가 해당내용이다.

 

이 함수를 통해

[1,2][3,4][5,6,[7,8]]과 같은 ',' 없는, string형태의 리스트들의 연속을 list로 바꿀 수 있다.

<json 모듈을 import 해주어야한다.>

import json

def convertToList(string): #string -> list
	def find_index(data, target):
		res = []
		lis = data
		while True:
			try:
				res.append(lis.index(target) + (res[-1] + 1 if len(res) != 0 else 0))
				lis = data[res[-1] + 1:]
			except:
				break
		return res
	res = ([[i, 'f'] for i in sorted(find_index(string, '['))]
		+ [[i, 'b'] for i in sorted(find_index(string, ']'), reverse=True)])
	res.sort(key=lambda x: x[0])
	k = 0
	cnt = 0
	for key in res:
		if key[1] == 'f':
			cnt += 1
		else:
			cnt -= 1
		if cnt == 0:
			if key[0] + k + 1 != len(string):
				string = (string[:key[0] + k + 1]
						+ ',' + string[key[0] + 1 + k:])
			k += 1
	return json.loads(('[' + string + ']').replace("'", '"'))

>사용 예시

print(convertToList("[1,2][3,4][5,6,[7,8]]"))

>출력

[[1, 2], [3, 4], [5, 6, [7, 8]]]
[Finished in 0.2s]

반응형