Тут у мене є цілі числа 1:7
для чотирьох різних розділів, тобто {1}, {2,3,4}, {5,6} і {7}, і ці розділи записані у списку, тобто list(1,c(2,3,4),c(5,6),7)
. Я розглядаю розділи як набори, так що різні перестановки елементів у межах одного розділу повинні бути розпізнані як однакові. Наприклад, list(1,c(2,3,4),c(5,6),7)
і list(7,1,c(2,3,4),c(6,5))
є рівнозначними.
Зауважте, що для елементів у списку немає повторення , наприклад, ні list(c(1,2),c(2,1),c(1,2))
, оскільки ця проблема обговорює ексклюзивні розділи для всього набору.
Я перерахував деякі різні перестановки до списку, lst
як показано нижче
lst <- list(list(1,c(2,3,4),c(5,6),7),
list(c(2,3,4),1,7,c(5,6)),
list(1,c(2,3,4),7,c(6,5)),
list(7,1,c(3,2,4),c(5,6)))
і те, що я хочу зробити, це перевірити, що всі перестановки є рівнозначними. Якщо так, то ми отримуємо результат TRUE
.
Те , що я зробив до сих пір є для сортування елементів в межах кожного розділу, і використовуються setdiff()
з interset()
і union()
судити про нього (див мого коду нижче)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Однак я думаю, що цей метод буде повільним, коли розмір розділу зменшується. Чи є якийсь швидший підхід, щоб це зробити? Вдячний заздалегідь!
- деякі тестові випадки (дані невеликого розміру)
# should return `TRUE`
lst1 <- list(list(1,c(2,3,4),c(5,6)),
list(c(2,3,4),1,c(5,6)),
list(1,c(2,3,4),c(6,5)))
# should return `TRUE`
lst2 <- list(list(1:2, 3:4), list(3:4, 1:2))
# should return `FALSE`
lst3 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))
lst_equal = list(list(1:2, 3:4), list(3:4, 1:2))
а також той, де має бути результат FALSE
, можливоlst_false <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))
FALSE
. Таким чином, коли відповідь працює на деякі, але не всі тестові випадки, легко діагностувати, чому. Якщо є лише один приклад, ви втрачаєте нюанс у результатах тесту. Також приємно додавати нові приклади, а не змінювати існуючі приклади під людьми, які вже над ними працювали.
lst
потенційно довга, ви можете отримати ефективність за допомогою інших підходів. Наприклад, перша перевірка, яка length(unique(lengths(lst))) == 1
дуже швидко повернеться, FALSE
якщо будь-який із внутрішніх списків має неправильну кількість елементів ....
lst
, по порівнянні lst[[i]]
з lst[[1]]
, і таким чином ви можете зупинитися , як тільки ви знайшли невідповідність, а не робити все порівняння. Якщо lst
довгі і FALSE
s звичайні, це може бути великим підвищенням ефективності, але, мабуть, не варто цього інакше.
Map
дзвінків