<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def find_kihs(assembly, hole_size=4, cutoff=7.0):
 """ KnobIntoHoles between residues of different chains in assembly. Notes ----- A KnobIntoHole is a found when the side-chain centre of a Residue a chain is close than (cutoff) Angstroms from at least (hole_size) side-chain centres of Residues of a different chain. Parameters assembly : Assembly hole_size : int Number of Residues required to form each hole. cutoff : float Maximum distance between the knob and each of the hole residues. Returns ------- kihs : [KnobIntoHole] """

    pseudo_group = side_chain_centres(assembly=assembly, masses=False)
    pairs = itertools.permutations(pseudo_group, 2)
    kihs = []
    for pp_1, pp_2 in pairs:
        for r in pp_1:
            close_atoms = pp_2.is_within(cutoff, r)
            # kihs occur between residue and (hole_size) closest side-chains on adjacent polypeptide.
            if len(close_atoms) < hole_size:
                continue
            elif len(close_atoms) > hole_size:
                close_atoms = sorted(close_atoms, key=lambda x: distance(x, r))[:hole_size]
            kih = OrderedDict()
            kih['k'] = r
            for i, hole_atom in enumerate(close_atoms):
                kih['h{0}'.format(i)] = hole_atom
            knob_into_hole = KnobIntoHole(pseudo_atoms=kih)
            kihs.append(knob_into_hole)
    return kihs