How to remove a list from another one ?

Hi all,

Could anyone help me to do this please : remove a list from another ?

Ex :
Col0 : [ a, b, a, d, c]
Col1 : [a , d]
=> Col2 = Col0 - Col1 = [ a, b, c]

Thanks in advanced for your help!

Best regards,

Thanh Thanh

Hi @tttpham

KNIME has -Set Operator- node () which allows to do this kind of operation:

This could be achieved using the complement operator.

Hope this helps.




Hi aworker,

Thanks for your reply. I just try the node, however, that’s not exactly what I need, cause it remove all the “a” elements :frowning:

You know another way ?

Thanks much!

Best regards,

Thanh Thanh

Hi @tttpham , this was a challenge I looked into a couple of weeks ago.

I could not find a way in Knime nodes where it could remove only 1 instance of an element. Knime would remove all instances of the element as you found out.

I used a Python script to achieve this. The trick is to use list.remove() as it allows you to remove only 1 occurrence of it.

Check out this thread for more details and sample workflow:


Hi @tttpham , I put something together for you.

The workflow looks like this:

The operation is done in the Python script, so it’s really all that you need.

The 2 Collection to String nodes is just to be able to view the elements in each list. By default, Knime only shows a certain amount of elements of a list:

As you can see, it’s hard to know what the elements are.

Temporarily converting them, and we can see the input data now:

I created 2 tests sample, 1 that is yours, and the other one a case where I want to remove 2 instances of “a” out of 3 to show that we can do as many instances as we want.

The Python code is really simple and looks like this:

# Copy input to output
output_table_1 = input_table_1.copy()

count = len(input_table_1['Col1'])
output_table_1['Col2'] = output_table_1['Col0'].copy()

for i in range(count):
  for col1 in (input_table_1['Col1'][i]):

Now, with the .copy() function, it is supposed to make a copy without referencing to the original. So, this means that if I am removing elements from the copy, it should not modify the original. For some reason, it is also modifying the original:

It is giving me the correct Col2, but it is also modifying Col0 for some reasons.

I’m not sure if it’s my Python environment that has an issue, or if it’s a Knime issue, or if I’m missing something (I’m not a Python developer).

You can try the workflow on your side to see if you get the same results, or if your Col0 stays as the original values.

Here’s the workflow: Remove one instance of element from list.knwf (16.2 KB)

Now, if you do get the same results as mine, I’m providing you the additional operation to rectify this via a Joiner node:

This will guarantee the proper results:

Here’s the workflow with the addition: Remove one instance of element from list.knwf (20.9 KB)


Hello @tttpham and @bruno29a,

here is solution with Column Expressions. (And KNIME nodes solution of which I’m not proud of :sweat_smile:)
2021_11_04_MinusListOperator.knwf (47.4 KB)



Nice one @ipazin !

You Knime nodes solution does not work as expected though when there are more than 1 row…

The Column Expression one works well. Great logic implemented there :slight_smile:

1 Like

Tnx @bruno29a :slight_smile:

Well that’s where I’m not proud of it cause you have to involve a loop :sweat_smile:


1 Like

Thanks @ipazin and @bruno29a, really appreciate your help !!

I’ll go with the column expression solution ( but instead of removeChars(arrayToString(arraySubset(column("AggregatedValues2"),i ,i+1 )),"{}" )

I put column("AggregatedValues2")[i] to simplify a little bit )

Again, thank you so much !

Have a nice day !

Thanh Thanh


Nice simplification! Didn’t know this will work. Great!

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.