1。使用 collections.defaultdict
您可以使用defaultdict 对出现多次的项目进行第一次分组,然后遍历dict.items 以获得您需要的内容。
from collections import defaultdict
lol = [[0,'a'], [0,'b'],
[1,'b'], [1,'c'],
[2,'d'], [2,'e'],
[2,'g'], [2,'b'],
[3,'e'], [3,'f']]
d = defaultdict(list)
for v,k in lol:
d[k].append(v)
# d looks like -
# defaultdict(list,
# {'a': [0],
# 'b': [0, 1, 2],
# 'c': [1],
# 'd': [2],
# 'e': [2, 3],
# 'g': [2],
# 'f': [3]})
result = [[v,k] for k,vs in d.items() for v in vs if len(vs)>1]
print(result)
[[0, 'b'], [1, 'b'], [2, 'b'], [2, 'e'], [3, 'e']]
2。使用 pandas.duplicated
这里是如何使用 Pandas 做到这一点 -
- 转换为 pandas 数据帧
- 对于键列,找到重复项并保留所有项
- 在忽略索引的情况下转换为记录列表
import pandas as pd
df = pd.DataFrame(lol, columns=['val','key'])
dups = df[df['key'].duplicated(keep=False)]
result = list(dups.to_records(index=False))
print(result)
[(0, 'b'), (1, 'b'), (2, 'e'), (2, 'b'), (3, 'e')]
3。使用 numpy.unique
您可以使用 numpy 以矢量化方式解决此问题 -
- 转换为numpy矩阵
arr
- 查找独特元素
u 及其计数c
- 过滤多次出现的唯一元素列表
dup
- 使用广播比较数组的第二列,并取任何 overaxis=0 来获得一个布尔值,对于重复的行为 True
- 根据这个布尔值过滤
arr
import numpy as np
arr = np.array(lol)
u, c = np.unique(arr[:,1], return_counts=True)
dup = u[c > 1]
result = arr[(arr[:,1]==dup[:,None]).any(0)]
result
array([['0', 'b'],
['1', 'b'],
['2', 'e'],
['2', 'b'],
['3', 'e']], dtype='<U21')