programing tip

for 루프 중에 목록 항목을 수정하는 방법은 무엇입니까?

itbloger 2020. 6. 18. 21:30
반응형

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-stylefor 루프를 수행하십시오 .

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

반응형