Tôi đang viết một công cụ tối ưu hóa nhỏ để mua tem tại bưu điện.Sắp xếp một từ điển Python phức tạp chỉ bằng một trong các giá trị của nó
Trong quá trình này Tôi đang sử dụng một cuốn từ điển, mà tôi đang sắp xếp theo những gì tôi học được trong "nổi tiếng" khác câu hỏi này: Sort a Python dictionary by value
Trong trường hợp của tôi từ điển của tôi là hơi phức tạp hơn:
- một bốn-mục-tuple để làm cho chính
- và một lăm-item-tuple để làm cho dữ liệu.
Nguồn gốc của từ điển này là một sự lặp lại, trong đó mỗi vòng lặp thành công được thêm một dòng:
MyDicco[A, B, C, D] = eval, post, number, types, over
Đây chỉ là một ví dụ nhỏ của một hoạt động tầm thường, cố gắng cho 75 cent:
{
(0, 0, 1, 1): (, 75, 2, 2, 0)
(0, 0, 0, 3): (, 75, 3, 1, 0)
(0, 0, 2, 0): (, 100, 2, 1, 25)
(0, 1, 0, 0): (, 200, 1, 1, 125)
(1, 0, 0, 0): (27.511, 350, 1, 1, 275)
}
cho đến nay tôi đang sử dụng mã này để sắp xếp (được đang làm việc):
MyDiccoSorted = sorted(MyDicco.items(), key=operator.itemgetter(1))
tôi đang sắp xếp theo đánh giá-score của tôi, bởi vì phân loại là tất cả về việc đưa giải pháp tốt nhất lên hàng đầu. Điểm đánh giá chỉ là một điểm dữ liệu trong số 5 mục-tuple (trong ví dụ đó là điểm đánh giá: 22, 31, 2521, 12511 và 27511).
Như bạn có thể thấy trong ví dụ trên, nó sắp xếp (như tôi muốn) bởi bộ tuple thứ hai, chỉ mục 1. Nhưng tôi phải (gắt gỏng) mang "điểm đánh giá" của tôi lên phía trước tuple. Mã rõ ràng là sử dụng toàn bộ phần thứ hai cho quá trình phân loại, quá nặng và không cần thiết.
Đây là câu hỏi của tôi: Làm thế nào tôi có thể vui lòng sắp xếp chính xác hơn. Tôi không muốn sắp xếp theo toàn bộ phần thứ hai của từ điển của tôi: Tôi muốn nhắm mục tiêu chính xác mục đầu tiên.
Và lý tưởng là tôi muốn đặt giá trị này trở lại vị trí ban đầu, cụ thể là mục cuối cùng trong bộ dữ liệu thứ hai - và vẫn sắp xếp theo nó.
Tôi đã đọc lên trên và thử nghiệm với cú pháp của operator.itemgetter() nhưng chưa được quản lý để chỉ "lấy" các "mục đầu tiên của mặt hàng thứ hai của tôi". https://docs.python.org/3/library/operator.html?highlight=operator.itemgetter#operator.itemgetter
(lưu ý: Đây là phép sử dụng các bộ như khóa và giá trị, theo:
https://docs.python.org/3/tutorial/datastructures.html?highlight=dictionary và những người đang làm việc tốt cho dự án của tôi; câu hỏi này chỉ là sắp xếp về tốt hơn)
Đối với những người thích một nền nhỏ (bạn sẽ hét lên với tôi rằng tôi nên sử dụng một số phương pháp khác, nhưng tôi đang học về từ điển ngay bây giờ (là một trong những mục đích của dự án này)):
Tối ưu hóa này dành cho các nước đang phát triển, nơi thường không có sẵn giá trị tem nhất định hoặc bị giới hạn trong kho tại bất kỳ bưu điện cụ thể nào. Sau đó nó sẽ chạy trên điện thoại Android.
Chúng tôi đang gửi thư thường xuyên (có, thư). Tìm ra chính xác bưu chính cho mỗi điểm đến với các giá trị có sẵn và tìm giải pháp với các cổ phiếu thấp của một số giá trị nhất định là một quy trình không tầm thường, nếu bạn xem xét sáu bưu chính đích và hàng trăm thư khác nhau để gửi thư.
Có module khác mà giúp biến các giải pháp tối ưu về lý thuyết thành một cái gì đó thực sự có thể được mua trên bất kỳ ngày nào, bởi chiến lược thoại-hướng dẫn ...
Về từ điển của tôi trong câu hỏi này: Tôi lặp trên tất cả hợp lý (đủ cao để thực hiện bưu chính cần thiết và chỉ trả quá tối đa một phần tem) kết hợp các giá trị tem.
Sau đó, tôi tính giá trị "thành công", dựa trên số lượng tem cần thiết (ưu tiên), số lượng loại cần thiết (ưu tiên thấp hơn) (vì mua tem khác nhau cần thêm thời gian tại quầy) hình phạt cao cho việc thanh toán. Vì vậy, giá trị thấp nhất có nghĩa là thành công cao nhất.
Tôi thu thập tất cả "giải pháp" hợp lý trong từ điển trong đó bộ tem cần thiết đóng vai trò là khóa và một bộ dữ liệu kết quả khác tạo nên các giá trị. Nó được định nghĩa quá mức bởi vì con người cần đọc nó ở giai đoạn này trong dự án (để gỡ lỗi).
Nếu bạn tò mò và muốn đọc ví dụ (dòng đầu tiên):
Các colums là:
- số tem 350 cent
- số tem 200 cent
- số tem 50 xu
- số tem 25 xu
- điểm đánh giá
- tính bưu chính áp dụng
- tổng số tem áp dụng
- tổng số tem-loại
- qua thanh toán theo đơn vị cent nếu có
Hoặc Bằng chữ: (Giả sử một dịch vụ bưu chính được cung cấp tem hiện tại là 350, 200, 50 và 25 xu), tôi có thể áp dụng bưu phí 75 xu bằng cách sử dụng 1x 50 xu và 1x 25 xu.Điều này mang lại cho tôi một đánh giá thành công của 22 (tốt nhất trong danh sách này), bưu chính là 75 cent, cần hai con tem của hai giá trị khác nhau và có 0 xu overpayment.
Đây là câu hỏi bao giờ đầu tiên của tôi trên stackoverflow và tôi rất ấn tượng và rất biết ơn đối với phản hồi: Superfast và rất, rất hữu ích. Tôi chỉ quyết định chọn câu trả lời đầu tiên, bởi vì nó làm những gì tôi cần (Tôi đã thử nghiệm nó với dự án của tôi). Tôi đã chọn chủ yếu quá nhanh, không người dùng nào khác cần dành thời gian với nhiều câu trả lời hơn. Tôi hạnh phúc và có thể chuyển sang các mô-đun tiếp theo. Cảm ơn tất cả!! –