Chuyển đến nội dung
Diễn đàn CADViet
concocnho

Thay thế phần tử thứ i của một list

Các bài được khuyến nghị

Tôi muốn thay thế phần tử thứ 10 của list này thành (1000. “2”) thì làm thế nào nhỉ?

((1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")

(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")

(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")

(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tôi muốn thay thế phần tử thứ 10 của list này thành (1000. “2”) thì làm thế nào nhỉ?

((1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")

(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")

(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")

(1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1") (1000 . "1")

)

- Cách 1: (subst (1000 . "2") (nth 9 "list bạn có") "list bạn có"). Cái này đúng với list được lấy ra bởi hàm entget . Cái list toàn (1000 . "1") tôi không biết bạn lấy đâu ra.

- Cách 2: cách này thì lại chỉ áp dụng đối với list của bạn.

_________(setq dem 0

______________Lst '()

__________)

_________(foreach e "list ban co"

___________(setq dem (1+ dem))

___________(if (/= dem 10)

______________(setq lst (append Lst '(1000 . "1")))

______________(setq lst (append Lst '(1000 . "2")))

___________)

_________)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

list này đúng là được lấy ra bởi hàm entget

Sao mình làm theo cách 1 mà kết quả là tất cả các (1000 . "1") đều đổi thành (1000 . "2"). Mình chỉ muốn vị trí thứ 10 đổi thôi.

Cách 2 thì không được rồi. Vì list toàn (1000 . "1") chỉ là ví dụ thôi. chứ thực ra nó có nhiều cái khác.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
list này đúng là được lấy ra bởi hàm entget

Sao mình làm theo cách 1 mà kết quả là tất cả các (1000 . "1") đều đổi thành (1000 . "2"). Mình chỉ muốn vị trí thứ 10 đổi thôi.

Cách 2 thì không được rồi. Vì list toàn (1000 . "1") chỉ là ví dụ thôi. chứ thực ra nó có nhiều cái khác.

Mình biết ngay mà. Bạn ví dụ 1 cái không có trong thực tế. Bởi chỉ số trước "1000" khi lấy ra bởi hàm entget chỉ có 1 mà thôi chứ không thể có đến 1 list gồm tới 6x4 phần tử. Bạn muốn có được câu trả lời đúng với ý bạn thì bạn phải cho người trả lời biết được câu hỏi đó nằm trong tình huống thực tế nào. Giải thích một điều mà sau đó bạn lại bảo thực tế "chỉ là ví dụ thôi. chứ thực ra nó có nhiều cái khác" thì mất thời gian cho người trả lời lắm. Bạn cho một ví dụ thực tế bạn làm đi. Hoặc có thể bạn lấy được list trên từ rất nhiều đối tượng bởi hàm mapcar thì bạn cũng phải nói rõ để người trả lời có hướng suy nghĩ đúng. Bạn đồng ý với mình không?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình lấy ví dụ cho dễ hình dung thôi chứ nó không khác gì so với thực tế đâu. Nó đây:

((1070 . -2000) (1070 . 1) (1070 . 2000) (1070 . 9) (1040 .

68.5891) (1040 . 0.0) (1000 . "TC2") (1040 . 0.0) (1040 . 0.0) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

468.906) (1040 . -30.0) (1070 . 0) (1000 . "0") (1040 . 468.906) (1040 . 0.0)

(1070 . 0) (1000 . "0") (1040 . 468.906) (1040 . 30.0) (1070 . 0) (1000 . "0"))

Đây là xdata của một cọc trên tuyến trong Nova TDN (phần mềm thiết kế đường).

Mình muốn đổi cao độ tự nhiên của nó (1040 . 0.0) (phần tử thứ 8) thành 1 số khác.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình biết ngay mà. Bạn ví dụ 1 cái không có trong thực tế. Bởi chỉ số trước "1000" khi lấy ra bởi hàm entget chỉ có 1 mà thôi chứ không thể có đến 1 list gồm tới 6x4 phần tử. Bạn muốn có được câu trả lời đúng với ý bạn thì bạn phải cho người trả lời biết được câu hỏi đó nằm trong tình huống thực tế nào. Giải thích một điều mà sau đó bạn lại bảo thực tế "chỉ là ví dụ thôi. chứ thực ra nó có nhiều cái khác" thì mất thời gian cho người trả lời lắm. Bạn cho một ví dụ thực tế bạn làm đi. Hoặc có thể bạn lấy được list trên từ rất nhiều đối tượng bởi hàm mapcar thì bạn cũng phải nói rõ để người trả lời có hướng suy nghĩ đúng. Bạn đồng ý với mình không?

 

 

Ông bạn Nataca này sai rồi. Đó là một yêu cầu cực kỳ rõ ràng. Dù cho có thực tế hay không thì số liệu đó cũng đầy đủ và trong sáng.

 

Cách đơn giản là copy sang một list mới từ phần tử thứ 1 (trong PC thì phần tử thứ nhất có index = 0) đến phần tử thứ i-1, thay phần tử thứ i bằng phần tử cần thay thế, copy các phần tử còn lại.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Đây rồi, đây rồi. Mừng quá :cheers: :cheers:

;; ----- nth-replace utility function

;;

;; Replace the II position in dList with the new value.

;;

(defun nth-replace (New II dList)

(cond

((null dList) nil)

((zerop II) (cons New (cdr dList)))

(T (cons (car dList)

(nth-replace New (1- II) (cdr dList))))))

;;

;; ----- nth-remove utility function

;;

;; Remove the II element in a data list.

;;

(defun nth-remove (II dList)

(cond

((null dList) nil)

((zerop II) (cdr dList))

(T (cons (car dList)

(nth-remove (1- II) (cdr dList))))))

;;

;; keep on programmin'

;;

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình lấy ví dụ cho dễ hình dung thôi chứ nó không khác gì so với thực tế đâu. Nó đây:

((1070 . -2000) (1070 . 1) (1070 . 2000) (1070 . 9) (1040 .

68.5891) (1040 . 0.0) (1000 . "TC2") (1040 . 0.0) (1040 . 0.0) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 . 9.0e+006) (1040 .

468.906) (1040 . -30.0) (1070 . 0) (1000 . "0") (1040 . 468.906) (1040 . 0.0)

(1070 . 0) (1000 . "0") (1040 . 468.906) (1040 . 30.0) (1070 . 0) (1000 . "0"))

Đây là xdata của một cọc trên tuyến trong Nova TDN (phần mềm thiết kế đường).

Mình muốn đổi cao độ tự nhiên của nó (1040 . 0.0) (phần tử thứ 8) thành 1 số khác.

Cái này đúng là mình không để ý thật :cheers: . Dùng Nova lâu ngày mà ít quan tâm đến nó. Bạn cũng thiết kế đường à. Có j cùng trao đổi trong box Giao Thông nữa nhé. :cheers:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Ông bạn Nataca này sai rồi. Đó là một yêu cầu cực kỳ rõ ràng. Dù cho có thực tế hay không thì số liệu đó cũng đầy đủ và trong sáng.

 

Cách đơn giản là copy sang một list mới từ phần tử thứ 1 (trong PC thì phần tử thứ nhất có index = 0) đến phần tử thứ i-1, thay phần tử thứ i bằng phần tử cần thay thế, copy các phần tử còn lại.

Mình đồng ý với bạn đây là một yêu cầu rõ ràng và dữ liệu đầu vào đầy đủ. Nhưng một bài toán có nhiều cách giải quyết. Cách của bạn cũng là tư duy lập trình của lập trình viên nói chung. Mình chỉ muốn nói rằng nếu bạn concocnho đưa ra cho mình dữ liệu xdata ngay từ đầu thì mình hiểu ngay ý nghĩa thực tế của bài toán là thay đổi cao độ tự nhiên của một cọc. Lúc đấy sẽ chọn cách giải quyết tối ưu cho trường hợp này. Còn vấn đề bạn nói "dù có thực tế hay không" thì trên quan điểm một người kỹ sư mình thích giải quyết bài toán thực tế hơn :cheers: . ok nhé.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình đồng ý với bạn đây là một yêu cầu rõ ràng và dữ liệu đầu vào đầy đủ. Nhưng một bài toán có nhiều cách giải quyết. Cách của bạn cũng là tư duy lập trình của lập trình viên nói chung. Mình chỉ muốn nói rằng nếu bạn concocnho đưa ra cho mình dữ liệu xdata ngay từ đầu thì mình hiểu ngay ý nghĩa thực tế của bài toán là thay đổi cao độ tự nhiên của một cọc. Lúc đấy sẽ chọn cách giải quyết tối ưu cho trường hợp này. Còn vấn đề bạn nói "dù có thực tế hay không" thì trên quan điểm một người kỹ sư mình thích giải quyết bài toán thực tế hơn :cheers: . ok nhé.

 

Tùy theo cách nghĩ của từng người, còn với mình nếu chưa giải quyết được thì đừng làm tối ưu.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình sửa cái này một chút như đúng với yêu cầu của bạn nhé:

- Cách 2: cách này thì lại chỉ áp dụng đối với list của bạn.

_________(setq dem 0

______________Lst '()

__________)

_________(foreach e "list ban co"

___________(setq dem (1+ dem))

___________(if (/= dem 10)

______________(setq lst (append Lst (nth (1- dem) "list ban co")))

____________(setq lst (append Lst '(1000 . "2")))

___________)

_________)

phần tử (1000 . 2) chính là phần tử mà bạn cần đưa vào, bạn có thể thay tùy thích. Xin lỗi vì không hiểu ý bạn ngay từ đầu :cheers:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×