Способы сравнения двух golang списков для проверки уникальности всех элементов - PullRequest
0 голосов
/ 07 марта 2020

Вопрос как указано в названии. Имея два списка известных типов, и вы просто хотели убедиться, что в обоих списках не используются одни и те же элементы, как вы можете это эффективно проверить в golang.

Все еще относительно плохо знакомы с golang. В Python я, вероятно, сделал бы что-то вроде этого:

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 1]

def check_lists_are_unique(list_one, list_two):
    return not bool(len(set(list_one) & set(list_two)))

print(check_lists_are_unique(a, b)) # returns True
print(check_lists_are_unique(a, c)) # returns False
print(check_lists_are_unique(b, c)) # returns True

Моя первая наивная первая попытка в golang будет:

a := []int{1, 2, 3}
b := []int{4, 5, 6}
c := []int{7, 8, 1}

checkUnique := func(listOne, listTwo []int) bool {
    for _, i := range listOne {
        for _, j := range listTwo {
            if i == j {
                return false
            }
        }
    }
    return true
}
fmt.Println(checkUnique(a, b)) // returns true
fmt.Println(checkUnique(a, c)) // returns false
fmt.Println(checkUnique(b, c)) // returns true

https://play.golang.org/p/vuBnv97MyWb

Интересно, действительно ли это самый эффективный способ сделать это сравнение в golang? Есть ли альтернативы или более «правильный» способ сделать это сравнение в golang?

Дополнительное примечание: Хотелось бы также услышать любые интересные / креативные / дурацкие способы сделать это, которые уникально golang - я sh.

1 Ответ

1 голос
/ 08 марта 2020

Я согласен с @JimB. Ваш пример - эффективный способ сравнить кусочки. См. Карту против производительности коммутатора в go. Сравнение кусков байтов вместо строк также эффективно. См. Лучше сравнить кусочки или байты? . Это также может быть верно для целых чисел. См. Приведенный ниже код и https://play.golang.org/p/w59ctLV9C9S.

  a := []byte{1, 2, 3}
  b := []byte{4, 5, 6}
  c := []byte{7, 8, 1}

  checkUnique := func(listOne, listTwo []byte) bool {
     for _, i := range listOne {
        for _, j := range listTwo {
           if i == j {
              return false
           }
        }
     }
     return true
  }
  fmt.Println(checkUnique(a, b)) // returns true
  fmt.Println(checkUnique(a, c)) // returns false
  fmt.Println(checkUnique(b, c)) // returns true

Это может быть неприменимо к вашему вопросу, но bytes.Equal эффективно для сравнения двух []byte. См. Проверка равенства двух срезов .

...