I can think of four ways to do this in addition to BetterRed's reading list suggestion.
- Using a Yes/No custom column per grouping. If doing additive selection, when you find a book to add to the group then click in the yes/no column, press F2, Y, Enter to set the column to Yes. If doing subtractive selection, use bulk edit to set all books to Yes then when you find a book to remove then press F2, N, Enter to set the column to No.
- Using a tag (or tags-like custom column, which I think is better) to indicate presence (when doing additive) or absence (with doing subtractive) from a grouping. Define a value that indicates that a book is (is not) in a group. When you find a book that should be (should not be) in a group, drag that book and drop it on the appropriate tag to apply that tag to a book.
- Using a composite column (column built from other columns) with the template {id}. This will show the book's internal calibre id in the column. Create a user category called in_group (or not_in_group). When you find a book that should be in (should not be in) the group, click in the identifiers custom cell then drag it to the appropriate user category. You end up with a user category containing a list of books in (not in) a group. This method is best when doing exceptions, as I am not sure whether the performance of a user category that contains thousands of items would be acceptable.
- Using temp marks. Doing either additive or subtractive grouping: when scanning books apply a Temp Mark to the book to indicate that it is to be processed later. For me the keyboard shortcut is Ctrl+M. Before quitting calibre (because temp marks are valid only for a session), search for marked:true, select all, and use bulk edit to set a tag or something else you prefer.
Note that solution 4 can be used with reading list or any of solutions 1 - 3.