programing

for loop 동안 목록 엔트리를 수정하려면 어떻게 해야 합니까?

luckcodes 2023. 1. 21. 10:12

for loop 동안 목록 엔트리를 수정하려면 어떻게 해야 합니까?

반복 루프 중에 목록을 수정하는 것은 안전하지 않다는 것을 알게 되었습니다.단, 문자열 목록이 있다고 가정하고 문자열 자체를 제거하려고 합니다.변경 가능한 값의 치환도 변경으로 간주됩니까?

다음 루프는 이미 확인된 요소만 변경하므로 허용 가능한 것으로 간주됩니다.

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!

(모든 아이템을 삭제하지 않았기 때문에 결과가 잘못되어 있습니다.)

갱신하다

이것은 매우 일반적인 대답이기 때문에, 「in-place(in-place)」의 엔트리를 효과적으로 삭제하는 방법은 다음과 같습니다(그것은 질문이 아닙니다).

b = ['a',' b', 'c ', ' d ']

b[:] = [entry for entry in b if entry.strip() == entry]

print(b)  # -> ['a']  # CORRECT

반복하는 동안 목록에서 항목을 제거하는 방법을 참조하십시오.

상태가 좋지 않다고 생각됩니다.목록에 대한 기존 참조를 유지해야 하는 경우 슬라이스 할당과 함께 목록 이해를 대신 사용하십시오.

a = [1, 3, 5]
b = a
a[:] = [x + 2 for x in a]
print(b)

loop variant의 경우는 enumerate()의 경우보다 1개 더 깨끗해 보입니다.

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 index, item in enumerate(l):
    l[index] = item.strip()

Ignacio Vazquez-Abrams의 대답은 정말 좋다.이 예에서 더 자세히 설명할 수 있습니다.상상해 보세요.

  1. 2개의 벡터가 있는 리스트가 표시됩니다.
  2. 리스트를 이동하여 각 배열의 순서를 반대로 하려고 합니다.

예를 들어 다음과 같습니다.

v = np.array([1,2,3,4])
b = np.array([3,4,6])

for i in [v, b]:
    i = i[::-1]   # This command does not reverse the string.

print([v,b])

다음과 같은 이점을 얻을 수 있습니다.

[array([1, 2, 3, 4]), array([3, 4, 6])]

한편, 다음과 같은 경우:

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])

결과는 다음과 같습니다.

[array([4, 3, 2, 1]), array([6, 4, 3])]

아니요, 그런 식으로 문자열을 변환할 수 있다면 목록의 "내용"을 변경하지 않을 것입니다.하지만 Python에서는 그것들은 변이할 수 없다.임의의 문자열 조작을 실행하면 새로운 문자열이 반환됩니다.

변경 가능한 객체 목록이 있는 경우 목록의 실제 내용을 변경하지 않는 한 이 작업을 수행할 수 있습니다.

따라서 어떤 종류의 지도를 작성해야 합니다.제너레이터 식을 사용하면 반복할 때 [작업]이 수행되어 메모리를 절약할 수 있습니다.

다음과 같은 작업을 수행할 수 있습니다.

a = [1,2,3,4,5]
b = [i**2 for i in a]

리스트를 이해하기 쉽게 하기 위해 리스트 이해라고 합니다.

삭제할 문자열을 결정하는 기준이 무엇인지 질문에서 명확하지 않지만 삭제할 문자열 목록을 가지고 있거나 작성할 수 있는 경우 다음을 수행할 수 있습니다.

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)

my_my를 [a], [c], [e]로 바꿉니다.

즉, 동일한 목록을 반복하면서 목록을 수정하는 것입니다.

list[:] = ["Modify the list" for each_element in list "Condition Check"]

예:

list[:] = [list.remove(each_element) for each_element in list if each_element in ["data1", "data2"]]

언급URL : https://stackoverflow.com/questions/4081217/how-to-modify-list-entries-during-for-loop