रूबी में सरणी से डुप्लिकेट तत्वों को निकालें


325

मेरे पास एक रूबी सरणी है जिसमें डुप्लिकेट तत्व हैं।

array = [1,2,2,1,4,4,5,6,7,8,5,6]

बिना लूप और पुनरावृत्ति का उपयोग किए बिना सभी अद्वितीय तत्वों को बनाए रखते हुए मैं इस सरणी से सभी डुप्लिकेट तत्वों को कैसे निकाल सकता हूं?

जवाबों:


722
array = array.uniq

uniq सभी डुप्लिकेट तत्वों को निकालता है और सरणी में सभी अद्वितीय तत्वों को बरकरार रखता है।

यह रूबी भाषा की कई सुंदरियों में से एक है।


50
नहीं, यूनीक! विधि शून्य वापस आ जाएगी अगर सरणी अद्वितीय अभी तक किया गया है Ex: a = [1,2,3,4] a.uniq -> [1,2,3,4] लेकिन a.unq! -> नील
दूखो

15
मैं वास्तव में इसे रूबी भाषा की सुंदरता के रूप में नहीं देखूंगा ... यह सिर्फ रूबी मानक पुस्तकालय की सुंदरता है? मुझे गलत मत समझिए, भाषा के बारे में बहुत सारी सुंदर बातें हैं।
जस्टिन एल।

7
Object-C, Javascript और PHP में समान लिखें। फिर हमें बताएं कि रूबी एक सुंदर भाषा नहीं है!
एडम वेट

3
यह जटिल प्रकारों के लिए भी काम करता है: [{how: "are"}, {u:"doing"}, {how: "are"}].uniq => [{:how=>"are"}, {:u=>"doing"}]
Blaskovicz

5
@duykhoa के बारे में क्या कहते हैं, यूनीक! विधि शून्य हो जाती है, लेकिन आप आमतौर पर इसकी वापसी के बारे में परवाह नहीं करते हैं .uniq!यह ऑब्जेक्ट पर ही काम करता है
carpinchosaurio

82

आप चौराहा वापस कर सकते हैं।

a = [1,1,2,3]
a & a

इससे डुप्लिकेट भी डिलीट हो जाएगा।


12
कार्यात्मक रूप से, यह उत्तर सही है, लेकिन मुझे लगता है कि यह यूनीक का उपयोग करने की तुलना में स्पष्ट रूप से कम पठनीय है।
फियोना टी

21
मैं इसे यहां डाल रहा था इसलिए जो भी इस पेज पर जाएगा उसे करने के अन्य तरीके भी दिखाई देंगे, मैं यह कहने की कोशिश नहीं कर रहा था कि यह किसी भी तरह से बेहतर है।
जेरेडस्मिथ

3
इसका कारण यह है क्योंकि सेट संचालन का उपयोग करते समय, परिणामी सरणी को एक सेट के रूप में माना जाता है, जो एक डेटा संरचना है जिसमें आमतौर पर कोई दोहराए गए मान नहीं होते हैं। a | a(संघ) का उपयोग करना एक ही चाल होगी।
सीजर

47

आप डुप्लिकेट तत्वों को यूनीक विधि से हटा सकते हैं:

array.uniq  # => [1, 2, 4, 5, 6, 7, 8]

यह जानने के लिए भी उपयोगी हो सकता है कि uniqब्लॉक है, इसलिए यदि आपके पास चाबियों का एक समूह है:

["bucket1:file1", "bucket2:file1", "bucket3:file2", "bucket4:file2"]

और आप जानना चाहते हैं कि अनोखी फाइलें क्या हैं, आप इसे इसके साथ देख सकते हैं:

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last }

5
मैं इससे थोड़ा भ्रमित हूं। ब्लॉक का उपयोग तब किया जाता है जब आपको अपने स्वयं के तुलनात्मक फ़ंक्शन की आवश्यकता होती है - आपके उदाहरण में, uniqएक ब्लॉक के बिना उस ऐरे को भेजने से वैसा ही मान वापस आएगा जैसा कि आपके ब्लॉक के साथ होता है।
hdgarrood

18

अगर किसी को परवाह है तो बस एक और विकल्प।

आप to_setएक सरणी की विधि का भी उपयोग कर सकते हैं जो एरे को सेट में परिवर्तित करता है और परिभाषा के अनुसार, सेट तत्व अद्वितीय हैं।

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

4
यदि आप स्मृति की परवाह करते हैं, to_setतो 4 वस्तुओं का आवंटन करेंगे, जबकि uniqएक को आवंटित करेंगे ।
जन क्लिमो

18

यदि कोई दोहराया मूल्यों के सभी उदाहरणों को हटाने के लिए एक रास्ता खोज रहा था, तो " मैं एक रूबी सरणी में दोहराया तत्वों को कुशलता से कैसे निकाल सकता हूं? " देखें।

a = [1, 2, 2, 3]
counts = Hash.new(0)
a.each { |v| counts[v] += 1 }
p counts.select { |v, count| count == 1 }.keys # [1, 3]

3
या बस कर सकता है a = [1, 2, 2, 3] a.find_all { |x| a.count(x) == 1 } # [1, 3]
टिम राइट

जुड़ा हुआ प्रश्न समान नहीं है; यह पूछ रहा है कि डुप्लिकेट किए गए मूल्यों को कैसे ढूंढें और उन्हें वापस लौटाएं। ओपी नकलचियों को हटाना चाहता है।
द टिन मैन

0

बस कुछ जानकारी प्रदान करने के लिए:

require 'fruity'
require 'set'

array = [1,2,2,1,4,4,5,6,7,8,5,6] * 1_000

def mithun_sasidharan(ary)
  ary.uniq
end

def jaredsmith(ary)
  ary & ary
end

def lri(ary)
  counts = Hash.new(0)
  ary.each { |v| counts[v] += 1 }
  counts.select { |v, count| count == 1 }.keys 
end

def finks(ary)
  ary.to_set
end

def santosh_mohanty(ary)
    result = ary.reject.with_index do |ele,index|
      res = (ary[index+1] ^ ele)
      res == 0
    end
end

SHORT_ARRAY = [1,1,2,2,3,1]
mithun_sasidharan(SHORT_ARRAY) # => [1, 2, 3]
jaredsmith(SHORT_ARRAY) # => [1, 2, 3]
lri(SHORT_ARRAY) # => [3]
finks(SHORT_ARRAY) # => #<Set: {1, 2, 3}>
santosh_mohanty(SHORT_ARRAY) # => [1, 2, 3, 1]

puts 'Ruby v%s' % RUBY_VERSION

compare do
  _mithun_sasidharan { mithun_sasidharan(array) }
  _jaredsmith { jaredsmith(array) }
  _lri { lri(array) }
  _finks { finks(array) }
  _santosh_mohanty { santosh_mohanty(array) }
end

कौन सा, कब चलाया जाता है:

# >> Ruby v2.7.1
# >> Running each test 16 times. Test will take about 2 seconds.
# >> _mithun_sasidharan is faster than _jaredsmith by 2x ± 0.1
# >> _jaredsmith is faster than _santosh_mohanty by 4x ± 0.1 (results differ: [1, 2, 4, 5, 6, 7, 8] vs [1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, ...
# >> _santosh_mohanty is similar to _lri (results differ: [1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, ...
# >> _lri is similar to _finks (results differ: [] vs #<Set: {1, 2, 4, 5, 6, 7, 8}>)

नोट: ये खराब परिणाम लौटाए:

  • lri(SHORT_ARRAY) # => [3]
  • finks(SHORT_ARRAY) # => #<Set: {1, 2, 3}>
  • santosh_mohanty(SHORT_ARRAY) # => [1, 2, 3, 1]

-4

अंतर्निहित कार्यों का उपयोग किए बिना, XOR ऑपरेटर का उपयोग करने का प्रयास करें:

a = [3,2,3,2,3,5,6,7].sort!

result = a.reject.with_index do |ele,index|
  res = (a[index+1] ^ ele)
  res == 0
end

print result

अंतर्निहित कार्यों के साथ:

a = [3,2,3,2,3,5,6,7]

a.uniq

2
मैं अपमानित नहीं हुआ और मैं रूबी के बारे में कुछ नहीं जानता, लेकिन यह .sort!भी एक इनबिल्ट फंक्शन नहीं है?
कैरोलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.