• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. Compare list content no matter on order

Stats

  • Locked Locked
  • Replies 3
  • Subscribers 143
  • Views 16621
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Compare list content no matter on order

berndfi
berndfi over 10 years ago

Hi
I want to compare the content of 2 lists not depended on the
list order and nondestructive on the original lists.

e.g.
listA = list(“a” “b” “c”)
listB = list(“a” “c” “b”)
listC = list(“a” b”)
listD = list(“a” “b” “c” “d”)

listA == listB => t
listA == listC => nil
listA == listD =>nil

I found a very pragmatic approach, but I’m wondering if there
isn’t any better way of implementing such a common task?

Best regards,

 Bernd

 1 procedure(compareListContent(listA listB "ll")
 2     let((returnVal)
 3
 4     if(length(listA) == length(listB) then
 5         foreach(element listA
 6             if(member(element listB) then
 7                 returnVal = t
 8             else
 9                 returnVal = nil
10             ) ;; close if      
11         ) ;; close foreach
12     else
13         returnVal = nil
14     ) ;; close if    
15
16     ) ;; close let
17 ) ;; close proecedure

 

 

  • Cancel
Parents
  • Andrew Beckett
    Andrew Beckett over 10 years ago

    Hi Bernd,

    It depends to some extent as to whether you have repeated entries in lists. Actually your code won't work anyway (assuming you fix the missing returnVal on line 15 because it will only actually tell you whether the last entry). but even if you used a forall instead of a foreach, it would not work if there was repetition in the first list but not in the second. In other words, if the code was:

    forall(element listA
      member(element listB)
    )

    then it works if you have your listA/listB examples above, but if you have:

    listA=list("a" "b" "b")
    listB=list("a" "c" "b")

    It would still return t. I guess you could use:

    length(listA)==length(listB) && forall(element listA member(element listB)) && forall(element listB member(element listA))

    Even that's not really correct though because you could have:

    listA=list("a" "b" "b")
    listB=list("b" "a" "a")

    and the expression above would return t.

    Also, the code wouldn't be terribly efficient for long lists. A couple of simple possibilities:

    sort(copy(listA) 'alphalessp)==sort(copy(listB) 'alphalessp)

    This stops it being destructive by using copy. Another (maybe less costly) implementation would be:

    procedure(CCFcompareListContent(listA listB)
      let(((contentCount makeTable('counts 0)))
        foreach(elem listA contentCount[elem]=contentCount[elem]+1)
        foreach(elem listB contentCount[elem]=contentCount[elem]-1)
        forall(elem contentCount zerop(contentCount[elem]))
      )
    )

    I didn't bother checking if the lists where the same length first, because that adds two more list iterations to the code - a bit of profiling might show that to be beneficial for long lists.

    I'm sure there are other ideas, but I'd thought I'd throw these out there.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • Andrew Beckett
    Andrew Beckett over 10 years ago

    Hi Bernd,

    It depends to some extent as to whether you have repeated entries in lists. Actually your code won't work anyway (assuming you fix the missing returnVal on line 15 because it will only actually tell you whether the last entry). but even if you used a forall instead of a foreach, it would not work if there was repetition in the first list but not in the second. In other words, if the code was:

    forall(element listA
      member(element listB)
    )

    then it works if you have your listA/listB examples above, but if you have:

    listA=list("a" "b" "b")
    listB=list("a" "c" "b")

    It would still return t. I guess you could use:

    length(listA)==length(listB) && forall(element listA member(element listB)) && forall(element listB member(element listA))

    Even that's not really correct though because you could have:

    listA=list("a" "b" "b")
    listB=list("b" "a" "a")

    and the expression above would return t.

    Also, the code wouldn't be terribly efficient for long lists. A couple of simple possibilities:

    sort(copy(listA) 'alphalessp)==sort(copy(listB) 'alphalessp)

    This stops it being destructive by using copy. Another (maybe less costly) implementation would be:

    procedure(CCFcompareListContent(listA listB)
      let(((contentCount makeTable('counts 0)))
        foreach(elem listA contentCount[elem]=contentCount[elem]+1)
        foreach(elem listB contentCount[elem]=contentCount[elem]-1)
        forall(elem contentCount zerop(contentCount[elem]))
      )
    )

    I didn't bother checking if the lists where the same length first, because that adds two more list iterations to the code - a bit of profiling might show that to be beneficial for long lists.

    I'm sure there are other ideas, but I'd thought I'd throw these out there.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
No Data

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information