Tôi đang tìm cách trích xuất n cặp khóa-giá trị ngẫu nhiên từ một băm.Có tương đương với `Array :: sample` cho băm không?
Trả lời
Hash[original_hash.to_a.sample(n)]
Đối với Ruby 2.1,
original_hash.to_a.sample(n).to_h
là chậm, hay một ý tưởng tồi, nếu tôi lấy dữ liệu từ một băm lớn hơn? sẽ có một cách tiếp cận thay thế để cố gắng sau đó? – appleLover
@appleLover Tôi không thể nghĩ ra bất cứ điều gì tốt hơn. – sawa
Tôi đã tò mò vì vậy tôi đã đánh giá nó ... trong trường hợp bất kỳ ai khác tò mò https://gist.github.com/bendyorke/924612cba7432cbf36dd – cadlac
Tôi không biết phương pháp như vậy. Tuy nhiên, bạn có thể làm điều gì đó như:
h[h.keys.sample]
Nếu bạn cần lấy mẫu nhiều hơn một phần thì mã sẽ phức tạp hơn một chút.
EDIT: để có được cặp giá trị quan trọng thay vì chỉ có giá trị mà bạn có thể làm điều gì đó như:
keys_sample = h.keys.sample(n)
keys_sample.zip(keys_sample.map{|k| h[k])
Điều này không trả lại cặp khóa-giá trị như OP muốn, chỉ giá trị cho một khóa ngẫu nhiên. –
@ theTinMan đúng. Điểm lấy. Sự thật là giải pháp của sawa là giải pháp gọn gàng nhất cho ** rằng ** vấn đề –
Nếu mẫu của bạn chỉ có một yếu tố , bạn có thể sử dụng điều này:
sample = h.keys.sample
h.select { |k,v| k == sample }
Hoặc nếu mẫu của bạn có chứa nhiều hơn một phần tử, sử dụng này:
n = 2
sample = h.keys.sample(n)
h.select { |k,v| sample.include?(k) }
Nếu h chỉ có một phần tử, thì hãy sử dụng '= h'. Bất cứ điều gì khác là quá mức cần thiết. –
Tôi đã nói nếu ** mẫu ** chỉ có một phần tử. Ví dụ của tôi giả định một băm có nhiều hơn một cặp khóa-giá trị. Sẽ không có điểm nào trong việc lấy mẫu băm với một phần tử ... – fbonetti
Tôi đang đề cập đến đoạn mã đầu tiên của bạn, không phải là mã thứ hai. –
Một cách để thực hiện điều này:
rank_hash = {"Listen" => 1, "Download" => 60, "Share" => 150, "Purchase" => 700 }
rank_array = rank_hash.to_a
Thân gọi này để có được mẫu mảng ngẫu nhiên của các cặp k/v:
rank_array[rand(0..3)]
hoặc điều này không khó mã hóa chiều dài mảng:
rank_array[rand(0..(rank_array.length) -1)]
Ví dụ:
["Download", 60]
Đọc câu trả lời đầu xếp hạng, tôi muốn đi với nó phụ thuộc:
Nếu bạn muốn lấy mẫu chỉ có một phần tử từ băm, @Ivaylo Strandjev's solution chỉ dựa vào tra cứu mã băm và
Array#sample
:hsh[hsh.keys.sample]
Để lấy mẫu nhiều yếu tố băm, @sawa's answer thúc đẩy
Array#to_h
:hsh.to_a.sample(n).to_h
Lưu ý rằng, as @cadlac mentions, hsh.to_a.sample.to_h
sẽ không hoạt động như mong đợi. Nó sẽ nâng cao
TypeError: wrong element type String at 0 (expected array)
vì Array#sample
trong trường hợp này trả về chỉ là mảng yếu tố, và không phải là mảng chứa các mảng phần tử.
Một cách giải quyết là giải pháp của mình, cung cấp một n = 1
như một cuộc tranh cãi:
hsh.to_a.sample(1).to_h
PS: không tìm kiếm upvotes, chỉ thêm nó như là một lời giải thích cho những người mới đến Ruby.
Tùy thuộc vào định dạng của bạn, 'hsh [hsh.keys.sample] .keys' cũng có thể là giải pháp, nếu bạn đang tìm kiếm các khóa con dưới một khóa băm cụ thể. Ví dụ: 'người dùng ['John Doe'] = user_hash' không chắc chắn có cách nào 'ruby' hơn để làm điều này không. – whodini9
- 1. IsNullOrEmpty tương đương với Array? C#
- 2. có tương đương với Array # compact cho các phần tử trống không?
- 3. tương đương chồng chéo của Array # lát
- 4. Tương đương với window.setTimeout() cho C++
- 5. Có tương đương ipython cho erlang không?
- 6. Có tương đương java.util.concurrent cho WeakHashMap không?
- 7. Có điều gì tương đương với Sonar cho Perl không?
- 8. Có tương đương với idifierForVendor của iOS cho Android không?
- 9. Có tương đương với PyMongo cho Python 3.2 không?
- 10. Có tương đương với Heroku cho nền tảng ASP.NET không?
- 11. Có tương đương với HLint cho Erlang không?
- 12. Có tương đương với Valgrind cho .Net trên Windows không?
- 13. Có tương đương với tăng :: multi_index cho Java someplace không?
- 14. Có tương đương Windows với fdopen cho HANDLE không?
- 15. Có tương đương với Jack cho nodej không?
- 16. Có tương đương với php.net cho JavaScript không?
- 17. Có một Coldfusion tương đương với PHP cho include_once không?
- 18. Có tương đương với Ruby cho Function.prototype.bind của JavaScript không?
- 19. Mono có tương đương với ILDASM không?
- 20. Có Java tương đương với libevent không?
- 21. Có Python tương đương với HighLine không?
- 22. jquery có tương đương với dojo.hitch() không?
- 23. NotifyIcon có tương đương với MouseDown không?
- 24. Có tương đương Profiler cho MySql không?
- 25. Có tương đương WPF cho ToolStripButton không?
- 26. Có tương đương C# với mảng array_key_exists của PHP không?
- 27. F # tương đương với số
- 28. Powerhell có tương đương với popen không?
- 29. Có tương đương C++ với getcwd không?
- 30. Python có tương đương với 'chuyển' không?
Sẽ giúp ích nếu bạn hiển thị mẫu băm đầu vào và giải thích thêm một chút về những gì bạn đang cố gắng sử dụng. Lấy các cặp khóa/giá trị ngẫu nhiên từ một hàm băm hiếm khi hữu ích, ngoại trừ có thể để thử nghiệm với các đầu vào ngẫu nhiên vào một cái gì đó, từ một tập đã biết. Đó là một yêu cầu rất kỳ quặc trong kinh nghiệm của tôi và làm cho tôi nghĩ rằng điều gì đó thật đáng kinh ngạc. –
tôi có nhu cầu tương tự này. tôi có một băm băm, nó cũng có thể được lưu trữ như một mảng băm. và nó có ý nghĩa để có thể lấy n mục ngẫu nhiên từ một mảng. – appleLover