2014-05-13 12 views
1

我有嵌套列表字符串:如何檢查是否字符串的嵌套列表包含相同的元素

mylist1 <- list(
    list(c("banana"),c("banana","tomato")) 
, list(c("", "nut"), c("nut", "orange")) 
    ) 

mylist2 <- list(
    list(c("orange","nut"), c("nut", "")) 
, list(c("tomato","banana"),c("banana")) 
) 

mylist3 <- list(
    list(c("orange","nut"), c("nut")) 
, list(c("tomato","banana"),c("banana")) 
) 

注意:在上面的例子中mylist1mylist2將是相等的。但是mylist3mylist1mylist2不同,與空字符串和「螺母」子表丟失c("nut", "")

在列表中的元素的順序並不重要。我想要一個比較兩個這樣的列表的函數,並返回一個布爾值,如果它們在忽略元素順序時是相等的。

本質上,我的嵌套列表類型字符串表示數學集。我想比較兩個這樣的嵌套列表,但是因爲它們表示集合的順序並不重要。我想要得到一個布爾(真/假)值。

+1

難道你不能把所有的元素都列出來嗎? 'all(unlist(mylist1)%in%unlist(mylist2)); all(unlist(mylist1)%in%unlist(mylist3))' – rawr

回答

1

如果您的列表中沒有重複的項目,可以使用Set和Set Operations。 因此,這將是這樣的:

(set1 <-c(mylist1, NA)) 
(set2 <-c(mylist2, NA)) 
setequal(set1, set2) 
0

您可以隨時對比清單1到第二個列表中的元素中的每個元素,但是這將需要很長的時間,幾乎是不可能的(在^ 2)(這是要是一個嵌套的循環) 我想到的另一個選擇是對兩個列表進行排序,然後在它們之間進行比較,因爲它們都是排序的,所以只需將列表1中的元素檢查到列表2中的相同順序元素 理論上第二種選擇會更快:(假設對列表進行排序時,使用nLog(n)) 它將是2 * nLog(n)+ n(檢查兩個排序列表的元素的次數)這是OnLog(n)

相關問題