Python Join Tuples If Similar Initial Element (original) (raw)

Given a list of tuples, combine (or join) all tuples that share the same first element into a single tuple. The order of remaining elements should be preserved. For Example:

**Input: [(5, 6), (5, 7), (5, 8), (6, 10), (7, 13)]
**Output: [(5, 6, 7, 8), (6, 10), (7, 13)]

Using defaultdict + loop

Python `

from collections import defaultdict

t = [(5, 6), (5, 7), (6, 8), (6, 10), (7, 13)] mapp = defaultdict(list)

for k, v in t: mapp[k].append(v)

res = [(k, *v) for k, v in mapp.items()] print(res)

`

Output

[(5, 6, 7), (6, 8, 10), (7, 13)]

**Explanation:

groupby() from the itertools module groups consecutive elements sharing the same key ideal when the input list is sorted by the first element.

Python `

from itertools import groupby

t = [(5, 6), (5, 7), (6, 8), (6, 10), (7, 13)] res = []

for k, g in groupby(t, key=lambda x: x[0]): vals = [v for _, v in g] res.append((k, *vals))

print(res)

`

Output

[(5, 6, 7), (6, 8, 10), (7, 13)]

**Explanation:

Using Dictionary + List Comprehension

Using a simple dictionary to accumulate values by their first element provides an easy and readable approach.

Python `

t = [(5, 6), (5, 7), (6, 8), (6, 10), (7, 13)] temp = {}

for x in t: temp[x[0]] = temp.get(x[0], []) + list(x[1:])

res = [(k,) + tuple(v) for k, v in temp.items()] print(res)

`

Output

[(5, 6, 7), (6, 8, 10), (7, 13)]

**Explanation:

Using Recursion

Recursion can be used to merge consecutive tuples dynamically by checking adjacent pairs and combining their values.

Python `

def join_tup(t, i): if i == len(t) - 1: return t elif t[i][0] == t[i + 1][0]: t[i] += t[i + 1][1:] t.pop(i + 1) return join_tup(t, i) else: return join_tup(t, i + 1)

t = [(5, 6), (5, 7), (6, 8), (6, 10), (7, 13)] res = join_tup(t, 0) print(res)

`