 <p>Using <code>NeighborSearch</code> is definitely the right idea - it constructs a <a href="https://en.wikipedia.org/wiki/K-d_tree" rel="nofollow">k-d tree</a>, which performs very fast lookups on nearest neighbors.</p> <p>If you have just a few residues to search around, I would use the <a href="http://www.biopython.org/DIST/docs/api/Bio.PDB.NeighborSearch.NeighborSearch-class.html#search" rel="nofollow"><code>search()</code></a> method on those residues' atoms (perhaps just their CA atoms for speed). This will be more efficient than using <code>search_all()</code> then filtering. I'll answer your two questions, then provide a complete solution at the bottom.</p> <hr> <blockquote> <p>How can I just create the atom_list using CA atoms only?</p> </blockquote> <p>You can either use <a href="http://docs.python.org/2.7/library/functions.html#filter" rel="nofollow"><code>filter</code></a>, or a list comprehension (I think list comprehensions are more readable):</p> <pre><code>atom_list = [atom for atom in structure.get_atoms() if atom.name == 'CA'] </code></pre> <hr> <blockquote> <p>Second, is <code>residuepair[0].id[1]</code> the correct way of generating the residue numbers (it works but is there a method to get this)?</p> </blockquote> <p>This is definitely the right approach. <em>However</em> (and this is a significant caveat), note that this will not handle residues with <a href="http://deposit.rcsb.org/adit/docs/pdb_atom_format.html#ATOM" rel="nofollow">insertion codes</a>. Why not deal with the <code>Residue</code> objects themselves?</p> <hr> <p>My code:</p> <pre><code>from Bio.PDB import NeighborSearch, PDBParser, Selection structure = PDBParser().get_structure('X', "1xxx.pdb") chain = structure[0]['A'] # Supply chain name for "center residues" center_residues = [chain[resi] for resi in [100, 140, 170, 53]] center_atoms = Selection.unfold_entities(center_residues, 'A') atom_list = [atom for atom in structure.get_atoms() if atom.name == 'CA'] ns = NeighborSearch(atom_list) # Set comprehension (Python 2.7+, use `set()` on a generator/list for &lt; 2.7) nearby_residues = {res for center_atom in center_atoms for res in ns.search(center_atom.coord, 10, 'R')} # Print just the residue number (WARNING: does not account for icodes) print sorted(res.id[1] for res in nearby_residues) </code></pre>