I have a function to do some thing like LEFT JOIN in SQL, the function use the itemgetter to get the "ON" and "SELECT" parameters of the two table(list of list), the problem is that itemgetter may return a value or a tuple of values, because of the inconsistent return type of itemgetter, I have to do 2^3 IF check, <br>
the function like this:<br><br>def left_join(table1, on_index1, table2, on_index2, getter1, getter2):<br>    """do thing like:<br>    SELECT on1(table1), g1(table1), g2(table2) FROM table1<br>    LEFT JOIN table2<br>
    ON on1(table1) == on2(table2)<br>    """<br>    on1 = itemgetter(*on_index1)<br>    on2 = itemgetter(*on_index2)<br>    g1 = itemgetter(*getter1)<br>    g2 = itemgetter(*getter2)<br><br>    d2 = {}<br>    d2 = dict((on2(r2), r2) for r2 in table2)<br>
<br>    #if itemgetter always return tuple, below could simple as one line<br>    #return [ list(on1(r1) + g1(r1) + g2(d2.get(on1(r1)))) for r1 in table1 ]<br><br>    len_on = len(on_index1)<br>    len_g1 = len(getter1)<br>
    len_g2 = len(getter2)<br><br>    if len_on == 1:<br>        if len_g1 == 1 and len_g2 == 1:<br>            return [ [on1(r1), g1(r1), g2(d2.get(on1(r1)))] for r1 in table1 ]<br>        elif len_g1 == 1 and len_g2 > 1:<br>
            return [ list((on1(r1),g1(r1))+g2(d2.get(on1(r1)))) for r1 in table1 ]<br>        elif len_g1 > 1 and len_g2 == 1:<br>            return [ list((on1(r1),)+g1(r1)+(g2(d2.get(on1(r1))),))  for r1 in table1 ]<br>
        else: #len_g1 > 1 and len_g2 > 1:<br>            return [ list((on1(r1),)+g1(r1)+g2(d2.get(on1(r1)))) for r1 in table1 ]<br>    else: # len_on > 1<br>        if len_g1 == 1 and len_g2 == 1:<br>            return [ list(on1(r1))+[g1(r1),g2(d2.get(on1(r1)))] for r1 in table1 ]<br>
        elif len_g1 == 1 and len_g2 > 1:<br>            return [ list(on1(r1)+(g1(r1),)+g2(d2.get(on1(r1)))) for r1 in table1 ]<br>        elif len_g1 > 1 and len_g2 == 1:<br>            return [ list(on1(r1)+g1(r1)+(g2(d2.get(on1(r1))),))  for r1 in table1 ]<br>
        else: #len_g1 > 1 and len_g2 > 1:<br>            return [ list(on1(r1)+g1(r1)+g2(d2.get(on1(r1)))) for r1 in table1 ]<br><br>so is there a way to force itemgetter to return tuple even when itemgetter(only_have_one_argument)? or some other function to do this?<br>
<br>Thanks.<br><br><br>