У меня есть два списка
a = [1, 2, 3, 4, 1, 2]
b = a.uniq # b = [1, 2, 3, 4]
c = a - b
результат получает c = []
Я ожидаю результат c = [1, 2]
Как я могу получить это?
У меня есть два списка
a = [1, 2, 3, 4, 1, 2]
b = a.uniq # b = [1, 2, 3, 4]
c = a - b
результат получает c = []
Я ожидаю результат c = [1, 2]
Как я могу получить это?
Это ожидаемый результат в соответствии с Документация массива.
Если вы хотите получить значения, которые имеют несколько вхождений в массив, вы могли бы что-то вроде:
a.uniq.keep_if {|v| a.count(v) > 1}
Если используется Ruby 1.8, keep_if
недоступен, поэтому вам нужно использовать что-то вроде:
a.uniq.delete_if {|v| a.count(v) == 1}
(Оба метода сохраняют a
неповрежденными)
Если вы хотите получить элементы из массива, которые появляются более одного раза, вы можете использовать следующий код:
a.delete_if { |x| a.count(x) <= 1 }.uniq
Если вы хотите выполнить вспомогательную операцию на двух массивах на основе позиции элементов, вы можете использовать следующий код:
i = 0
a.drop_while { |x| b[i+=1] == x }.uniq
Из документации
Array Difference - возвращает новый массив, который является копией исходного массива, удаляя любые элементы, которые также отображаются в other_ary. (Если вам нужно поведение типа установки, см. Класс библиотеки Set.)
Вы ищете все дубликаты или наоборот uniq? Возможно, эта ссылка поможет: Определить дубликаты в массиве
Похоже, вы пытаетесь найти элементы с дубликатами. Вот несколько способов, выберите тот, который вам нравится:
a.select { |x| a.count(x) > 1 }.uniq
a.sort.each_cons(2).map { |x,y| x if x == y }.compact
a.group_by{|x|x}.values.select{|k|k.size>1}.map(&:first)