【问题标题】:Finding duplicates in a list, including permutations在列表中查找重复项,包括排列
【发布时间】:2012-10-31 08:05:15
【问题描述】:

我想确定列表是否包含任何重复元素,同时将排列视为等效。所有向量的长度相等。

完成此任务的最有效方法(最短运行时间)是什么?

## SAMPLE DATA
a  <- c(1, 2, 3)
b  <- c(4, 5, 6)
a.same <- c(3, 1, 2)

## BOTH OF THSE LISTS SHOULD BE FLAGGED AS HAVING DUPLICATES
myList1 <- list(a, b, a)
myList2 <- list(a, b, a.same)


# CHECK FOR DUPLICATES
anyDuplicated(myList1) > 0  # TRUE
anyDuplicated(myList2) > 0  # FALSE, but would like true. 

现在我在检查重复项之前对列表中的每个成员进行排序

anyDuplicated( lapply(myList2, sort) ) > 0

我想知道是否有更有效的选择。此外,在?duplicated 文档中,它表示“将其用于列表可能会很慢”。还有其他更适合列表的函数吗?

【问题讨论】:

    标签: r list duplicates


    【解决方案1】:

    你可以使用setequal:

    myList1 <- list(a, b, a)
    myList2 <- list(a, b, a.same)
    myList3 <- list(a,b)
    
    test1 <- function(mylist) anyDuplicated( lapply(mylist, sort) ) > 0
    
    test1(myList1)
    #[1] TRUE
    test1(myList2)
    #[1] TRUE
    test1(myList3)
    #[1] FALSE
    
    test2 <- function(mylist) any(combn(length(mylist),2,
                               FUN=function(x) setequal(mylist[[x[1]]],mylist[[x[2]]])))
    
    test2(myList1)
    #[1] TRUE
    test2(myList2)
    #[1] TRUE
    test2(myList3)
    #[1] FALSE
    
    library(microbenchmark)
    
    microbenchmark(test1(myList2),test2(myList2))
    #Unit: microseconds
    #            expr     min       lq   median       uq     max
    #1 test1(myList2) 142.256 150.9235 154.6060 162.8120 247.351
    #2 test2(myList2)  63.306  70.5355  73.8955  79.5685 103.113
    

    【讨论】:

    • 好建议。不幸的是,它适用于较小的列表,但对于较大的列表效率不高。
      LargeList
    【解决方案2】:

    这个……怎么样?

    a  <- c(1, 2, 3)
    b  <- c(4, 5, 6)
    a.same <- c(3, 1, 2)
    myList1 <- list(a, b, a)
    myList2 <- list(a, b, a.same)
    
    # For exact duplicated values: List1
    DF1 <- do.call(rbind, myList1)  # From list to data.frame
    ind1 <- apply(DF1, 2, duplicated) # logical matrix for duplicated values
    DF1[ind1] # finding duplicated values  
    [1] 1 2 3
    
    # For permutations: List2
    DF2 <- do.call(rbind, myList2)
    ind2 <- apply(apply(DF2, 1, sort), 1, duplicated)
    DF2[ind2] # duplicated values
    [1] 3 1 2
    

    【讨论】:

    • 我们可以假设向量的长度相等吗?
    • 是的,这里假设向量具有相同的长度。
    【解决方案3】:
        a=[1,2,3]
        b=[4,5,6]
        samea=[3,2,1]
    
     list1=list(a+b+a) and list(a+b+sames) both of this will create a list with same element
       [1, 2, 3, 4, 5, 6, 3, 2, 1]
    
       ####so finding duplicate Function
    
       def findDup(x):
             for i in x:
                   if x.count(i)>1: return True
    
             return False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-17
      • 2013-02-21
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多