python 리스트에서 반복적으로 insert나 delete할 때 문제 질문합니다.
조회수 414회
python에서 for loop를 활용해서 데이터를 반복적으로 제거하면 loop가 돌아갈 면서 이미 데이터를 지워서 원하는 결과를 못 찾는 경우를 해결하고 싶습니다.
data = [1, 2 , 3, 4, 5, 6]
for i in range(len(data)):
if data[i] < 5:
del(data[i])
data = [2, 3, 4, 5]
for i in range(len(data)):
if data[i] < 4:
data.insert(i, 'a')
위에 insert의 경우도 유사하게 문제가 나오는 것 같은데,
원하는 결과는 4보다 작은 숫자라고 판별난 2, 3 뒤에 'a'라는 문자열이 들어왔으면 좋겠습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
또 다른방법도 적어봅니다.
1~4 를 삭제할 것이 아니라 4보다 큰 것만 선택해도 됩니다.
In [1]: data = [1, 2 , 3, 4, 5, 6] In [2]: data = [i for i in data if i > 4] # 4보다 큰 것만 선택 In [3]: data Out[3]: [5, 6]
- set 를 이용한 방법.
set 은 집합으로 중복요소 없는 list 와 유사하고 다양한 집합연산이 가능합니다 그중 +, - 같은 연산도 포함됩니다.
In [1]: data = [1, 2 , 3, 4, 5, 6] In [2]: data = list(set(data) - {i for i in data if i < 5}) # 집합에서 5보다 작은것 뺌 In [3]: data Out[3]: [5, 6]
- f'' 을 이용한 interpolation 처리(python 3.6 이상)
In [1]: data = [2, 3, 4, 5] In [2]: data = [f'{i}a' for i in data if i < 4] In [3]: data Out[3]: ['2a', '3a']
- 반복에 사용하는 기본모듈인 itertools 의 chain 를 이용하면 편하게 할 수 있습니다.
In [20]: data = [2, 3, 4, 5] In [21]: import itertools as it In [22]: pair_data = [(i, 'a') for i in data if i < 4] In [23]: pair_data Out[23]: [(2, 'a'), (3, 'a')] In [24]: list(it.chain(*pair_data)) # flattern 처리 Out[24]: [2, 'a', 3, 'a']
-
일반적으로 말해서, 어떤 배열/목록을 순회하는 도중에 그 배열의 길이를 바꾸는 것은 매우 좋지 않은 아이디어입니다.
혹시 원하시는 것은
filter()
그리고map()
이 아닐런지요??data = [1, 2, 3, 4, 5, 6] data = filter(lambda x: x < 5, data) print(data) # [1, 2, 3, 4]
data = [2, 3, 4, 5] data = map(lambda z: str(z) + 'a', filter(lambda y: y < 4, data)) print(data) # ['2a', '3a']
- 감사합니다. 1번은 제가 생각한 의도가 맞습니다. 그런데 2번은 2,3이라는 숫자 뒤에 글자가 붙는게 아니고, 다음 인덱스에 항목이 들어가는 것을 생각했습니다.print(data) #[2, 'a', 3, 'a'] 답변 감사합니다 :-) 알 수 없는 사용자 2019.12.31 09:02
댓글 입력