For numbers i usually sort them ascending, and then using a small algorithm remove the duplicate entries, something along the lines of this:
1.First use the sort component to sort the values
2. Plug the result into a vb.net component in x, remember to set x to list.
3. Use the following algorithm, or something alike it
Dim numbers as new list(of double)
'Zero or some value you are sure will not be in your list
dim last_val as double = 0
for i as int32 = 0 to x.count()-1
if not x(i) = last_val then
numbers.add(x(i))
last_val = x(i)
end if
next
a=numbers
I haven't tried it out, i just wrote the code here, so bear with me if it does not work and you have to make some correction.
You can do something similar with points and vectors where you check their coordinates against eachother, for other geometry, it will be somewhat more complicated i think.
I couldn't get the script to work but it would be amazing if it could delete specific items from a list which is hard to do with GH alone(i.e. If i want to get rid of all the items which have 0 as an index).
When i copy pasted the script it i got the message hereafter.
It would be great if as y we could plug the item index that we want to get rid of in the list...
This is how you can do it entirely in Grasshopper. The logic here is:
1. Create a list of incremental numbers with the same length as your input (an index map). This will allow us to maintain list order after we're done.
2. Sort your input number while synchronously sorting the index map. Identical numbers are now adjacent in the list, but since we also sorted the index map we know the permutation that was needed to convert the unsorted list into the sorted one.
3. Shift your sorted numbers one to the right (using Wrap=False). This now gives you another list (one item shorter) which you can compare with the sorted list using an Equals component. We'll use the NotEquals output to create a culling pattern which will remove all duplicates from the sorted list.
4. Before we do so however, we need to prepend a single value (True) to the culling pattern, since shifting has resulting in a pattern that is one element too short. Since we know that the first item in any list is always unique, we can prepend a true value.
5. Cull both the sorted list and the sorted index map.
6. Sort again, this time using the mangled index map as Keys to put the original list back into order again.
A problem with this approach is that sorting does not pay attention to the initial order of identical items. Thus, if you have four equal numbers in your original list, there's no telling in what order they end up.
A tacky way to solve that last problem could be to create another list of numbers (or modify the index list) with a very small step size, something like 0.001. Then add it to the original list and use the resulting list for sorting. The first of the duplicated numbers will always pop on top.
Thanks for the great reply David. This will help me out in quite a few instances. One example where I want to use this is to filter out duplicate points via the Decompose Component and applying this to the X,Y and Z numbers. I cannot think of another way to do it for now.
It's easy enough for me to make a component that removes duplicates from lists. Be it numbers, points or strings. Curves, BReps and meshes are a bit harder, but also doable.
Permalink Reply by Lian on October 5, 2009 at 8:27pm
David, could you please explain how to remove duplicate points?
I have a pair of adjoining triangles, and would like to delete one of each of the vertices that they share. The ultimate goal is to create an outline of the parallelogram created by the two; am I barking up the right tree?