首页 > 解决方案 > 删除复杂的重复列表

问题描述

我有一个奇怪的原始数据,其中包含不同方式和长度的多个名称。就像是:

data = [
'apple',
'apple;apple(big)',
'apple(apple),apple',
'banana(banana)',
'banana',
nan, # yes, there is some nan datas.
'cookie;cookie(cookie)',
'cookie(choco)']

在演示案例中,所需的输出是最短的有效名称,output = ['apple', 'banana', 'cookie']

我考虑的方式是声明一个output =[]并遍历数据并比较输出中是否存在元素,如果不存在,则追加输出;如果存在,则比较两者是否相似并返回长度较小的一个。但这似乎效率很低,我不知道如何比较并获得最小的有效值。

我也尝试了正则表达式,但它失败了,因为有效结果也是随机放置的。我如何完成任务?

标签: python

解决方案


假设:来自 pandas 的 DataFrame 或 Series 的数据

偶然发现评论nan表明您的数据源是“数据框的元素”。所以我假设你也可以使用pandas

脚步

  1. 删除 NaN 并重新索引(仅适用于 pandas)
  2. 清理数据:例如 'cookie;cookie(cookie)' 到 'cookie,cookie'
  3. 用逗号分隔并分解(添加为行):例如 'cookie,cookie' 以分隔行 ['cookie', 'cookie']

集成到 pandas 的解决方案

为简单起见,数据被定义为Series(一维列表)。

import pandas as pd
import numpy as np  # to inject NaN values

s = pd.Series([
'apple',
'apple;apple(big)',
'apple(apple),apple',
'banana(banana)',
'banana',
np.nan,  # fixed the syntax
'cookie;cookie(cookie)',
'cookie(choco)'
])

unique = (
    s.dropna()  # remove the NaN values
    .reset_index(drop=True)  # adjust the index as if NaN never existed
    .str.replace(r'\(.*[^)]?', '')  # replace parentheses-enclosed (incl. half-open) by empty string"
    .str.replace(r'[;.]', ',')  # replace semicolon or period by comma
    .str.split(',').explode()  # split to rows (add possible duplicate elements)
    .unique()  # reduce to unique
)

print(type(unique))
print(unique)

印刷:

<class 'numpy.ndarray'> ['apple' 'banana' 'cookie']


推荐阅读