for 루프 중에 목록 항목을 수정하는 방법은 무엇입니까?
이제 반복 반복 중에 목록을 수정하는 것이 안전하지 않다는 것을 알고 있습니다. 그러나 문자열 목록이 있고 문자열 자체를 제거하고 싶다고 가정하십시오. 변경 가능한 값의 대체는 수정으로 간주됩니까?
나쁜 형태로 간주됩니다. 목록에 대한 기존 참조를 유지해야하는 경우 슬라이스 할당과 함께 목록 이해를 대신 사용하십시오.
a = [1, 3, 5]
b = a
a[:] = [x + 2 for x in a]
print(b)
아래 루프는 이미 본 요소 만 수정하므로 허용 가능한 것으로 간주됩니다.
a = ['a',' b', 'c ', ' d ']
for i, s in enumerate(a):
a[i] = s.strip()
print(a) # -> ['a', 'b', 'c', 'd']
다음과는 다릅니다.
a[:] = [s.strip() for s in a]
인덱싱 작업이 더 필요하지만 임시 목록을 만들고 원본을 대체하기 위해 할당 할 필요가 없습니다.
주의 : 이 방법으로 항목 을 수정할 수 있지만 list
문제가 발생할 가능성이없는 한 항목 수를 변경할 수 없습니다 .
다음은 내가 의미하는 바의 예입니다. 항목을 삭제하면 해당 시점부터 인덱싱이 엉망이됩니다.
b = ['a', ' b', 'c ', ' d ']
for i, s in enumerate(b):
if s.strip() != b[i]: # leading or trailing whitespace?
del b[i]
print(b) # -> ['a', 'c '] # WRONG!
(필수 항목을 모두 삭제하지 않았기 때문에 결과가 잘못되었습니다.)
최신 정보
이것은 매우 인기있는 답변이므로 다음과 같이 "제자리에서"항목을 효과적으로 삭제하는 방법은 다음과 같습니다 (정확한 질문은 아니지만).
b = ['a',' b', 'c ', ' d ']
b[:] = [entry for entry in b if entry.strip() == entry]
print(b) # -> ['a'] # CORRECT
for 루프 변형이 하나 더 있는데 enumerate ()를 사용하는 것보다 깨끗해 보입니다.
for idx in range(len(list)):
list[idx]=... # set a new value
# some other code which doesn't let you use a list comprehension
추가 / 제거 요소를 목록으로 변경하지 않는 한 목록을 반복하는 동안 각 요소를 수정하는 것이 좋습니다.
당신은 목록 이해를 사용할 수 있습니다 :
l = ['a', ' list', 'of ', ' string ']
l = [item.strip() for item in l]
또는 C-style
for 루프를 수행하십시오 .
for index, item in enumerate(l):
l[index] = item.strip()
문자열을 그런 식으로 변경할 수 있다면 목록의 "내용"을 변경하지 않을 것입니다. 그러나 파이썬에서는 변경이 불가능합니다. 모든 문자열 작업은 새 문자열을 반환합니다.
변경 가능한 것으로 알고있는 개체 목록이있는 경우 목록의 실제 내용을 변경하지 않는 한이 작업을 수행 할 수 있습니다.
따라서 어떤 종류의지도를 작성해야합니다. 생성기 표현식을 사용하면 반복 할 때 [작업]이 수행되고 메모리가 절약됩니다.
다음과 같이 할 수 있습니다 :
a = [1,2,3,4,5]
b = [i**2 for i in a]
리스트 내에서 쉽게 루핑 할 수 있도록리스트 이해력이라고합니다.
Jemshit Iskenderov와 Ignacio Vazquez-Abrams의 대답은 정말 좋습니다. 이 예제를 통해 더 설명 할 수 있습니다.
a) 두 개의 벡터가있는 목록이 제공됩니다.
b) 목록을 탐색하고 각 배열의 순서를 바꾸고 싶습니다.
Let's say you have
v = np.array([1, 2,3,4])
b = np.array([3,4,6])
for i in [v, b]:
i = i[::-1] # this command reverses the string
print([v,b])
You will get
[array([1, 2, 3, 4]), array([3, 4, 6])]
On the other hand, if you do
v = np.array([1, 2,3,4])
b = np.array([3,4,6])
for i in [v, b]:
i[:] = i[::-1] # this command reverses the string
print([v,b])
The result is
[array([4, 3, 2, 1]), array([6, 4, 3])]
It is not clear from your question what the criteria for deciding what strings to remove is, but if you have or can make a list of the strings that you want to remove , you could do the following:
my_strings = ['a','b','c','d','e']
undesirable_strings = ['b','d']
for undesirable_string in undesirable_strings:
for i in range(my_strings.count(undesirable_string)):
my_strings.remove(undesirable_string)
which changes my_strings to ['a', 'c', 'e']
참고URL : https://stackoverflow.com/questions/4081217/how-to-modify-list-entries-during-for-loop
'programing tip' 카테고리의 다른 글
쉘 명령의 소스 코드를 어떻게 읽습니까? (0) | 2020.06.18 |
---|---|
파일 크기가 구성된 제한 (2560000)을 초과합니다. 코드 통찰력 기능을 사용할 수 없습니다 (0) | 2020.06.18 |
상태 표시 줄 아래에 겹치는 툴바 (0) | 2020.06.18 |
파이썬에서 zip의 역함수는 무엇입니까? (0) | 2020.06.18 |
사전의 순서는 왜 임의적인가? (0) | 2020.06.18 |