Non essendo un grande fan di one-liner (o complessità), proporrò una soluzione molto esplicita e leggibile (che di solito è una buona cosa!) al tuo problema.
Così, in un approccio molto semplicistico, si potrebbe fare questo:
def insertElements(oldList):
"""
Return a new list, alternating oldList tuples with
new tuples in the form (oldList[i+1][0],oldList[i][1])
"""
newList = []
for i in range(len(oldList)-1):
# take one tuple as is
newList.append(oldList[i])
# then add a new one with items from current and next tuple
newList.append((oldList[i+1][0],oldList[i][1]))
else:
# don't forget the last tuple
newList.append(oldList[-1])
return newList
oldList = [(3, 10), (4, 7), (5, 5)]
newList = insertElements(oldList)
che vi darà il risultato desiderato in newList
:
print(newList)
[(3, 10), (4, 10), (4, 7), (5, 7), (5, 5)]
Questo non è il codice molto più lungo altre soluzioni più sofisticate (ed efficienti in termini di memoria!), come l'utilizzo di generatori, E lo considero molto più facile da leggere rispetto alle intricate one-liner. Inoltre, sarebbe facile aggiungere alcuni controlli a questa semplice funzione (come assicurarsi di avere una lista di tuple).
A meno che non si sappia già che è necessario ottimizzare questo particolare pezzo del codice (supponendo che faccia parte di un progetto più grande), questo dovrebbe essere good enough. Allo stesso tempo è: facile da implementare, facile da leggere, facile da spiegare, facile da mantenere, facile da estendere, facile da refactoring, ecc.
Nota: tutte le altre risposte precedenti alla tua domanda sono anche soluzioni migliori di questa semplice, in molti modi. Volevo solo darti un'altra scelta. Spero che questo ti aiuti.
Qual è l'input dell'utente? la nuova posizione del nuovo olmo? –
L'utente fornisce solo la "lista vecchia" iniziale. Quindi, tra ogni 2 vecchi elementi, viene aggiunto un nuovo elemento in base ai due esistenti. –