01/10/2018, 10:12

Vấn đề với For loop và remove function in python

Đoạn code của mình như sau:

print """data = [1, 2, 3, "nam sau bay", 8]
test = ["bay", 8, 9, 10, "muoi mot"]
sumboth = data + test
"""


data = [1, 2, 3, "nam sau bay", 8]
test = ["Bay", 8, 9, 10, "muoi mot"]
sumboth = data + test
# kiểm tra điều kiện if và in biến trong data và test
for da in data:
	if da > 0:
		print da,

print

for te in test:
	if te > 0:
		print te,

print
# chạy điều kiện if với remove
for da in data:
	if da > 0:
		data.remove(da)

for te in test:
	if te > 0:
		test.remove(te)

for su in sumboth:
	if su > 0:
		sumboth.remove(su)

print

print "in data: ", data
print "in test: ", test
print "in sum: ", sumboth

mình không hiểu sao python cho ra kết quả kì lạ như vậy.

Khoa NTA viết 12:20 ngày 01/10/2018

Bạn vừa duyệt từng phần tử trong mảng và đồng thời remove phần tử trong mảng, nó làm thay đổi vị trí nên gây ra kết quả sai lệch. Để ý thì dễ thấy được:

  • Các phần tử đều lớn hơn 0 (là số dương, ký tự, chuỗi, kể cả chuỗi rỗng).
  • Các phần tử bị rì mu đều thuộc vị trí lẻ (đánh số từ 1): data = [1, 2, 3, "nam sau bay", 8] ==(removed)==> data = [<removed>, 2, <removed>, "nam sau bay", <removed>], tức là còn data = [2, "nam sau bay"]

Lý do nôm na để giải thích là bên trong Python vẫn lấy phần tử ra bằng cách tăng chỉ số, xóa 1 phần tử ở vị trí hiện tại sẽ làm phần tử kế tiếp bị đẩy xuống và bị bỏ qua.

>>> data = [1, 2, 3, "nam sau bay", 8]
>>> for e in data:
...  print "current element [%d]: %s"  %(data.index(e), e)
...  data.remove(e)
...
current element [0]: 1
current element [1]: 3
current element [2]: 8
>>> print data
[2, 'nam sau bay']
Baal viết 12:26 ngày 01/10/2018

cảm ơn bạn nhiều. Để mình fix đoạn code lại

Bài liên quan
0