Error de asteriscos dobles: Sintaxis no válida

Pregunta original aquí

Quiero sumr el [qty] basado en [pid] [dbid] [eid] [sid].

este código funciona en v3.6.4 pero cuando migro a v3.4, aparece un mensaje de error:

new_d = [ [{'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 10, 'sid': 6}, {'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 20, 'sid': 6}], [{'pid': 232, 'dbid': 1, 'eid': 6212, 'qty': 1, 'sid': 56}, {'pid': 232, 'dbid': 1, 'eid': 6212, 'qty': 1, 'sid': 56}], [{'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 100, 'sid': 56}, {'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 100, 'sid': 56}]] final_result = [{**i[0], **{'qty':sum(b['qty'] for b in i)}} for i in new_d] ^ SyntaxError: invalid syntax 

** se puede usar para descomprimir diccionarios en argumentos de palabras clave en llamadas de función. A partir de python 3.5, se agregó al lenguaje PEP 448 – Generalizaciones de desempaque adicionales . Esto expande los lugares donde puede descomprimir las tuplas ( *some_tuple ) y los diccionarios ( **some_dict ).

En

 {**i[0], **{'qty':sum(b['qty'] for b in i)}} 

i[0] es el primer dict de la lista y {'qty':sum(b['qty'] for b in i)} es un dict con una tecla que sum los valores de 'qty' en la lista. El operador ** desempaqueta ambos diccionarios y dado que el constructor del diccionario ahora admite un número arbitrario de desempaquetados, los dos diccionarios se fusionan en uno.

Todo esto se puede hacer con una función para Python 3.4 y anteriores

 def d_summary(d_list): summary = d_list[0].copy() summary['qty'] = sum(b['qty'] for b in d_list) return summary final_result = [d_summary(i) for i in new_d]