Kombinieren Sie zwei Array-Daten mit dem inneren Join

Ich habe zwei Datensätze im Array:

arr1 = [ ['2011-10-10', 1, 1], ['2007-08-09', 5, 3], ... ] arr2 = [ ['2011-10-10', 3, 4], ['2007-09-05', 1, 1], ... ] 

Ich möchte sie zu einem Array wie folgt kombinieren:

 arr3 = [ ['2011-10-10', 1, 1, 3, 4], ... ] 

Ich meine, kombiniere diese Zeilen nur mit der gleichen Datumssäule.

=== EDIT ===

Vielen Dank an alle, nur für die Klärung, ich brauche nicht die Zeilen, die nicht in beiden Array erscheinen, nur fallen sie.

6 Solutions collect form web for “Kombinieren Sie zwei Array-Daten mit dem inneren Join”

Organisieren Sie Ihre Daten anders (Sie können leicht umwandeln, was Sie bereits zu zwei dict s haben):

 d1 = { '2011-10-10': [1, 1], '2007-08-09': [5, 3] } d2 = { '2011-10-10': [3, 4], '2007-09-05': [1, 1] } 

Dann:

 d3 = { k : d1[k] + d2[k] for k in d1 if k in d2 } 

Sie können die Arrays in einen Dict umwandeln und wieder zurück.

 d1 = dict((x[0],x[1:]) for x in arr1) d2 = dict((x[0],x[1:]) for x in arr2) keys = set(d1).union(d2) n = [] result = dict((k, d1.get(k, n) + d2.get(k, n)) for k in keys) 

Ein einziger Wörterbuchansatz:

 tmp = {} # add as many as you like into the outermost array. for outer in [arr1,arr2]: for inner in outer: start, rest = inner[0], inner[1:] # the list if key exists, else create a new list. Append to the result tmp[start] = tmp.get(start,[]) + rest output = [] for k,v in tmp.iteritems(): output.append([k] + v) 

Das wäre das Äquivalent einer vollständigen äußeren Verknüpfung (gibt Daten von beiden Seiten zurück, auch wenn eine Seite null ist). Wenn du einen inneren Verband wolltest, kannst du ihn dazu ändern:

 tmp = {} keys_with_dupes = [] for outer in [arr1,arr2]: for inner in outer: start, rest = inner[0], inner[1:] original = tmp.get(start,[]) tmp[start] = original + rest if original: keys_with_dupes.append(start) output = [] for k in keys_with_dupes: v = tmp[k] output.append([k] + v) 

Generator-Funktionsansatz, überspringen entsprechende Elemente, deren Daten nicht übereinstimmen:

 import itertools def gen(a1, a2): for x,y in itertools.izip(a1, a2): if x[0] == y[0]: ret = list(x) ret.extend(y[1:]) yield ret else: continue >>print list(gen(arr1, arr2)) [['2011-10-10', 1, 1, 3, 4]] 

Aber ja, wenn möglich, organisieren Sie Ihre Daten anders.

Es sei denn, beide sind sehr große Listen, ich würde ein Wörterbuch benutzen:

 arr1 = [ ['2011-10-10', 1, 1], ['2007-08-09', 5, 3] ] arr2 = [ ['2011-10-10', 3, 4], ['2007-09-05', 1, 1] ] table_1 = dict((tup[0], tup[1:]) for tup in arr1) table_2 = dict((tup[0], tup[1:]) for tup in arr2) merged = {} for key, value in table_1.items(): other = table_2.get(key) if other: merged[key] = value + other 

Andernfalls wäre es effizienter, jeden zu sortieren, und dann mache eine solche Verschmelzung. Aber ich stelle mir für die meisten Zwecke vor, das wäre schnell genug.

Es kann erwähnenswert sein, Datentypen zu erwähnen. Da ihre Methoden auf die Art des Problems abgestimmt sind. Die Set-Operatoren erlauben es Ihnen, Sets einfach und flexibel mit voller, innerer, äußerer, linker, rechter Joins zu verbinden. Wie bei Wörterbüchern, Sätze nicht behalten Reihenfolge, aber wenn Sie einen Satz zurück in eine Liste geworfen, können Sie dann eine Bestellung auf dem Ergebnis beitreten. Alternativ können Sie auch ein Wörterbuch verwenden .

 set1 = set(x[0] for x in arr1) set2 = set(x[0] for x in arr2) resultset = (set1 & set2) 

Hier bekommst du nur die Vereinigung von Daten in den Originallisten, um arr3 zu rekonstruieren, musst du die [1:] – Daten in arr1 und arr2 anhängen, wo die Daten im Ergebnis gesetzt sind. Diese Rekonstruktion wäre nicht so ordentlich wie die Verwendung der Wörterbuch-Lösungen oben, aber mit Sets ist würdig Rücksicht auf ähnliche Probleme.

Python ist die beste Programmiersprache der Welt.