답변:
나쁜 형태로 간주됩니다. 목록에 대한 기존 참조를 유지해야하는 경우 슬라이스 할당과 함께 목록 이해를 대신 사용하십시오.
a = [1, 3, 5]
b = a
a[:] = [x + 2 for x in a]
print(b)
print b
명령문이 실행될 때 a
대체되지 않고 제자리에서 수정 되었는지 알 수 있습니다 . 또 다른 가능성은 print b is a
둘 다 여전히 동일한 객체를 참조하는지 확인하는 것입니다.
아래 루프는 이미 본 요소 만 수정하므로 허용 가능한 것으로 간주됩니다.
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 i in a
? 이것은 매우 반 직관적이며 다른 언어와 다르게 보이고 내 코드에서 오랫동안 디버깅 해야하는 오류가 발생했습니다. 파이썬 튜토리얼에서는 언급조차하지 않습니다. 거기에 어떤 이유가 있어야하지만?
a[i]
과 s
)을 사용합니까? 나는 오히려 오히려 할 a[i] = a[i].strip()
것이다.
a[i] = s.strip()
하나의 인덱싱 작업 만 수행 하기 때문입니다.
enumerate(b)
는 모든 반복에서 인덱싱 작업을 수행하고으로 다른 작업을 수행 a[i] =
합니다. AFAIK 그것은 루프 반복 당 하나의 인덱싱 작업으로 파이썬 에서이 루프를 구현하는 것은 불가능합니다 :(
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
range(len(list))
이 파이썬에서 코드 냄새 와 같은 것을 사용하는 것을 고려 합니다.
enumerate
생성기이므로 튜플 목록을 만들지 않으므로 목록을 반복 할 때 한 번에 하나씩 생성합니다. 어느 것이 더 느린지를 알 수있는 유일한 방법은 timeit
입니다.
Jemshit Iskenderov와 Ignacio Vazquez-Abrams의 답변은 정말 좋습니다. 이 예제를 통해 더 자세히 설명 할 수 있습니다.
a) 두 개의 벡터가있는 목록이 제공됩니다.
b) 목록을 탐색하고 각 배열의 순서를 바꾸고 싶습니다.
당신이 있다고 가정 해 봅시다
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])]
제거 할 문자열을 결정하기위한 기준이 무엇인지 확실하지 않지만 제거 할 문자열 목록이 있거나 제거 할 수있는 경우 다음을 수행 할 수 있습니다.
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_strings를 [ 'a', 'c', 'e']로 바꿉니다.