Czy istnieje skuteczny sposób scalania dwóch list krotek w python, na podstawie wspólnej wartości. Obecnie robię co następuje:Przyłącz listy według wartości
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)
powraca:
[(9, 'John', 'Smith', 'Builder'), (11, 'Bob', 'Dobbs', 'Baker'), (14, 'Joe', 'Bloggs', 'Candlestick Maker')]
Podczas gdy ten kod działa perfekcyjnie dla małych listach, to niezwykle wolno przez dłuższy list z milionami rekordów. Czy istnieje skuteczniejszy sposób, aby to napisać?
EDYCJA Numery w pierwszej kolumnie są niepowtarzalne.
EDYTOWANIE Zmodyfikowano kod QR dla Jana Kugelmana. Dodano get(), na wypadek gdyby słownik nazw nie zawierał pasującego klucza w słowniku zawodów:
>>>> 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')}
Dla wydajności często prawo struktura danych jest kluczem. Użyj słownika. –
Zostawić usuniętą odpowiedź jako komentarz dla <10 tysięcy użytkowników. * Jeśli * twoja lista jest pewna, że ma * dokładnie * pasujące wpisy, możesz użyć ['zip'] (https://docs.python.org/2/library/functions.html#zip) wraz z [listą ze zrozumieniem] (https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions) jak w '[(x [0], x [1], x [2], y [1]) dla x, y in zip (nazwa, zawód)] ' –
@BhargavRao Myślę, że to uczciwe założenie, dlaczego inaczej OP nie pokazywałby niezgodności w przykładzie? –