Один подход к словарю:
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)
Это будет эквивалент полного внешнего соединения (возвращает данные с обеих сторон, даже если одна сторона равна нулю). Если вы хотите внутреннее соединение, вы можете изменить его на это:
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)