রুবিতে কোন অ্যারের অংশটি কীভাবে ফিরে আসবেন?


125

পাইথনের একটি তালিকা সহ আমি নিম্নলিখিত কোডটি ব্যবহার করে এর একটি অংশ ফিরে আসতে পারি:

foo = [1,2,3,4,5,6]
bar = [10,20,30,40,50,60]
half = len(foo) / 2
foobar = foo[:half] + bar[half:]

যেহেতু রুবি অ্যারেতে সমস্ত কিছু করে আমি ভাবছি এর সাথে এর মতো কিছু আছে কিনা।

উত্তর:


192

হ্যাঁ, রুবির পাইথনের সাথে খুব অনুরূপ অ্যারে-স্লাইসিং সিনট্যাক্স রয়েছে। riঅ্যারে সূচক পদ্ধতির জন্য এখানে ডকুমেন্টেশন রয়েছে:

--------------------------------------------------------------- Array#[]
     array[index]                -> obj      or nil
     array[start, length]        -> an_array or nil
     array[range]                -> an_array or nil
     array.slice(index)          -> obj      or nil
     array.slice(start, length)  -> an_array or nil
     array.slice(range)          -> an_array or nil
------------------------------------------------------------------------
     Element Reference---Returns the element at index, or returns a 
     subarray starting at start and continuing for length elements, or 
     returns a subarray specified by range. Negative indices count 
     backward from the end of the array (-1 is the last element). 
     Returns nil if the index (or starting index) are out of range.

        a = [ "a", "b", "c", "d", "e" ]
        a[2] +  a[0] + a[1]    #=> "cab"
        a[6]                   #=> nil
        a[1, 2]                #=> [ "b", "c" ]
        a[1..3]                #=> [ "b", "c", "d" ]
        a[4..7]                #=> [ "e" ]
        a[6..10]               #=> nil
        a[-3, 3]               #=> [ "c", "d", "e" ]
        # special cases
        a[5]                   #=> nil
        a[6, 1]                #=> nil
        a[5, 1]                #=> []
        a[5..10]               #=> []

5
একটি [5, 1] ​​একটি [6, 1] থেকে আলাদা কেন?
ডার্তোনি


25
a[2..-1]3 য় উপাদান থেকে শেষ এক পেতে। a[2...-1]তৃতীয় উপাদান থেকে দ্বিতীয় শেষ উপাদান পর্যন্ত পেতে।
চতুর প্রোগ্রামার

1
@ রাফা চিয়ার্স, ভাবছেন যে এই জাঙ্কটি কীভাবে কাজ করে, -1 কৌশলটি করেছে
বেন সিনক্লেয়ার

@ ক্লিভারপ্রগ্রামের সিনট্যাক্স গ্রহণযোগ্য উত্তরের চেয়ে পাইথনের আরও কাছাকাছি। আমি রুবিকে ভালবাসি, তবে আমি অবশ্যই বলব যে পাইথনের বাক্য গঠনটি আরও কম এবং পরিষ্কার। বোনাস হিসাবে, পদক্ষেপটি নির্দিষ্ট করা সম্ভব:range(10)[:5:-1]
এরিক ডুমিনিল


17

আপনি এর জন্য স্লাইস () ব্যবহার করতে পারেন :

>> foo = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
>> bar = [10,20,30,40,50,60]
=> [10, 20, 30, 40, 50, 60]
>> half = foo.length / 2
=> 3
>> foobar = foo.slice(0, half) + bar.slice(half, foo.length)
=> [1, 2, 3, 40, 50, 60]

যাইহোক, আমার জ্ঞানের সর্বাধিক, পাইথন "তালিকাগুলি" কেবল দক্ষতার সাথে গতিশীলভাবে বাড়ছে অ্যারে বাস্তবায়িত। শুরুতে সন্নিবেশটি ও (এন) এ থাকে, শেষে সন্নিবেশটি হে (1) অনুমিত হয়, এলোমেলো অ্যাক্সেস ও (1)।


দ্বিতীয় স্লাইসে বার অ্যারে ব্যবহার করার অর্থ কি?
শমূয়েল

এফওয়াইআই: slice!()স্থানে অ্যারেটি সংশোধন করে না, বরং এটি "সূচক (দৈর্ঘ্যের উপাদানগুলি পর্যন্ত দৈর্ঘ্যের উপাদানগুলি পর্যন্ত) বা কোনও ব্যাপ্তির দ্বারা প্রদত্ত উপাদান (গুলি) মুছে দেয়" " প্রতি রুবি
জোশুয়া পিন্টার ২

7

অন্য উপায় হ'ল পরিসর পদ্ধতিটি ব্যবহার করা

foo = [1,2,3,4,5,6]
bar = [10,20,30,40,50,60]
a = foo[0...3]
b = bar[3...6]

print a + b 
=> [1, 2, 3, 40, 50 , 60]

3

রুবি ২.6 শুরুর / অন্তহীন রেঞ্জের

(..1)
# or
(...1)

(1..)
# or
(1...)

[1,2,3,4,5,6][..3]
=> [1, 2, 3, 4]

[1,2,3,4,5,6][...3]
 => [1, 2, 3]

ROLES = %w[superadmin manager admin contact user]
ROLES[ROLES.index('admin')..]
=> ["admin", "contact", "user"]

2

আমি এর জন্য রেঞ্জগুলি পছন্দ করি:

def first_half(list)
  list[0...(list.length / 2)]
end

def last_half(list)
  list[(list.length / 2)..list.length]
end

যাইহোক, শেষ পয়েন্টটি আপনার পরিসীমাতে অন্তর্ভুক্ত করা হয়েছে কিনা তা সম্পর্কে খুব সাবধান হন। এটি একটি বিজোড় দৈর্ঘ্যের তালিকার জন্য সমালোচনামূলক হয়ে ওঠে যেখানে আপনাকে মাঝখানে কোথায় ভাঙতে হবে তা বেছে নেওয়া দরকার। অন্যথায় আপনি মধ্য উপাদানকে দ্বিগুণ গণনা শেষ করবেন।

উপরের উদাহরণটি ধারাবাহিকভাবে মাঝের উপাদানটিকে শেষার্ধে রাখবে।


আপনার (list.length / 2.0).ceilযদি প্রয়োজন হয় তবে আপনি প্রথমার্ধে ধারাবাহিকভাবে মাঝারি উপাদানটি রেখে দিতে পারেন।
সৌরাশি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.