Esiste un modo efficace per unire due elenchi di tuple in python, in base a un valore comune. Attualmente, sto facendo la seguente:Unisci gli elenchi per valore
name = [
(9, "John", "Smith"),
(11, "Bob", "Dobbs"),
(14, "Joe", "Bloggs")
]
occupation = [
(9, "Builder"),
(11, "Baker"),
(14, "Candlestick Maker")
]
name_and_job = []
for n in name:
for o in occupation:
if n[0] == o[0]:
name_and_job.append((n[0], n[1], n[2], o[1]))
print(name_and_job)
rendimenti:
[(9, 'John', 'Smith', 'Builder'), (11, 'Bob', 'Dobbs', 'Baker'), (14, 'Joe', 'Bloggs', 'Candlestick Maker')]
Anche se questo codice funziona perfettamente bene per le piccole liste, è incredibilmente lenta per liste più lunghe con milioni di dischi. C'è un modo più efficiente per scrivere questo?
MODIFICA I numeri nella prima colonna sono univoci.
EDIT Modificato il codice di @John Kugelman leggermente. Aggiunto un get(), nel caso in cui il dizionario nomi non ha una chiave corrispondente nel dizionario occupazione:
>>>> names_and_jobs = {id: names[id] + (jobs.get(id),) for id in names}
>>>> print(names_and_jobs)
{9: ('John', 'Smith', None), 11: ('Bob', 'Dobbs', 'Baker'), 14: ('Joe', 'Bloggs', 'Candlestick Maker')}
Per prestazioni spesso la struttura di dati a destra è la chiave. Usa un dizionario. –
Lasciando la mia risposta cancellata come commento per <10k utenti. * Se * la tua lista è sicura di avere * esattamente * voci corrispondenti, allora puoi usare ['zip'] (https://docs.python.org/2/library/functions.html#zip) insieme a un [elenco comprensione] (https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions) come in '[(x [0], x [1], x [2], y [1]) per x, y in zip (nome, occupazione)] ' –
@BhargavRao Penso che sia una buona ipotesi, perché altrimenti l'OP non mostrerebbe una non corrispondenza nell'esempio? –