假设我有一个元组列表

l = [('A', 12345), ('A', 2435), ('A', 2342), ('B', 2968), ('B', 9483), ('C', 563)]

使列表中的项目唯一的最有效方法是什么,如下所示:
l = [('A.1', 12345), ('A.2', 2435), ('A.3', 2342), ('B.1', 2968), ('B.2', 9483), ('C.1', 563)]

最佳答案

您还可以将 collections.defaultdict() 分组,然后使用 itertools.chain.from_iterable() 展平结果。无论结果是否排序,此方法均有效。

from collections import defaultdict

from itertools import chain

l = [("A", 12345), ("A", 2435), ("A", 2342), ("B", 2968), ("B", 9483), ("C", 563)]

# First group by first item in tuple
groups = defaultdict(list)
for k, v in l:
    groups[k].append(v)
# defaultdict(<class 'list'>, {'A': [12345, 2435, 2342], 'B': [2968, 9483], 'C': [563]})

# Now flatten grouped items into a flat list
result = list(
    chain.from_iterable(
        (("%s.%d" % (k, i), e) for i, e in enumerate(v, start=1))
        for k, v in groups.items()
    )
)

print(result)

输出:
[('A.1', 12345), ('A.2', 2435), ('A.3', 2342), ('B.1', 2968), ('B.2', 9483), ('C.1', 563)]

10-05 20:59