[英]What is an efficient way to make elements in a list of tuples unique in python?
假設我有一個元組列表
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)]
一種方法可能是使用itertools.groupby()
分組,然后“擴展”這些組:
from itertools import groupby
from operator import itemgetter
l = [('A', 12345), ('A', 2435), ('A', 2342), ('B', 2968), ('B', 9483), ('C', 563)]
print([
(f'{k}.{index}', v)
for k, g in groupby(l, itemgetter(0))
for index, (_, v) in enumerate(g, start=1)
])
印刷:
[('A.1', 12345), ('A.2', 2435), ('A.3', 2342), ('B.1', 2968), ('B.2', 9483), ('C.1', 563)]
請注意,要使分組起作用,輸入l
需要按分組鍵進行排序,本示例輸入似乎就是這種情況。
根據要求,我發布了一個熊貓方法來解決這個問題:
import pandas as pd
df = pd.DataFrame(l)
# Create a count per group and add them to the string:
df[0] = df[0] + "." + list(map(str,list(df.groupby(0).cumcount()+1)))
# Transpose the columns to rows so we can aggregate by 2 and create a tuple:
df.T.groupby(np.arange(len(df.T))//2).agg(tuple).to_numpy().tolist()[0]
輸出
[('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)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.