鱼C论坛

 找回密码
 立即注册
查看: 4657|回复: 31

[已解决]txt文件中删除重复项的问题 求助

[复制链接]
发表于 2022-8-9 10:25:18 | 显示全部楼层 |阅读模式
6鱼币
上午好,

我上传的C.txt包含了如下示例集合:
仔细一看会发现所示两个集合是重复项,只是集合中元素位置不同,

{W2,H0YITV=EHENER,H0YITV=EM_E}
{W2,H0YITV=EM_E,H0YITV=EHENER}

那么,在保证C.txt中原来的排序不变的前提下,能自动删除示例一样的重复一项吗?至于删除示例的哪一项,没要求。只是被删除的一个集合需要留下一个空集合。

示例的结果是:

{W2,H0YITV=EHENER,H0YITV=EM_E}
{}

如果两个集合如下:
{w1,A,B01}
{w1,A,B}
那么这两个集合不算重复项。

数据有点多,人工看来看去 不能保证前后一致了,所以想求大佬帮一下。谢谢。

最佳答案
2022-8-9 10:25:19
我不太确定代码是不是百分百正确,我人工查看了几个,应该是对的
我把去重后的文本放到了新的文件叫B.txt
import re
with open('C.txt', 'r', encoding='utf-8') as f:
  data = f.readlines()
new_data = []
for item in data:
  item = item.strip()
  sorted_item = sorted(re.sub(r'[\{|\}]', '', item).split(','))
  new_data.append(','.join(sorted_item))
for index, item in enumerate(new_data):
  if item in new_data[0:index] or item in new_data[index+1:]:
    data[index] = '{}\n'
    new_data[index] = ''
with open('B.txt', 'w', encoding='utf-8') as f:
  f.writelines(data)

最佳答案

查看完整内容

我不太确定代码是不是百分百正确,我人工查看了几个,应该是对的 我把去重后的文本放到了新的文件叫B.txt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 10:25:19 | 显示全部楼层    本楼为最佳答案   
我不太确定代码是不是百分百正确,我人工查看了几个,应该是对的
我把去重后的文本放到了新的文件叫B.txt
import re
with open('C.txt', 'r', encoding='utf-8') as f:
  data = f.readlines()
new_data = []
for item in data:
  item = item.strip()
  sorted_item = sorted(re.sub(r'[\{|\}]', '', item).split(','))
  new_data.append(','.join(sorted_item))
for index, item in enumerate(new_data):
  if item in new_data[0:index] or item in new_data[index+1:]:
    data[index] = '{}\n'
    new_data[index] = ''
with open('B.txt', 'w', encoding='utf-8') as f:
  f.writelines(data)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 10:29:14 | 显示全部楼层
C.txt (149.86 KB, 下载次数: 10)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 15:12:30 | 显示全部楼层
这题目挺有意思,我也来玩玩,^_^
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <regex>

using std::cin, std::cout, std::endl;
using std::vector, std::string;
using std::equal, std::any_of, std::for_each;
using std::istream, std::ostream;
using std::getline;
using std::regex, std::ssub_match, std::sregex_token_iterator;

using node_t = vector<string>;
using line_t = vector<node_t>;
using file_t = vector<line_t>;

bool operator==(const node_t &a, const node_t &b) {
    if(a.size() != b.size()) return false;
    return equal(a.begin(), a.end(), b.begin());
}

bool operator==(const line_t &a, const line_t &b) {
    for(auto iter = a.begin(); iter != a.end(); ++iter) {
        if(!any_of(b.begin(), b.end(), [&iter](const node_t &n) -> bool {return n == *iter;}))
            return false;
    }
    return true;
}

ostream &operator<<(ostream &os, const node_t &node) {
    bool output = false;
    for_each(node.begin(), node.end(), [&os, &output](const string &str) -> void {
        if(output) os << "=";
        output = true;
        os << str;
    });
    return os;
}

ostream &operator<<(ostream &os, const line_t &line) {
    bool output = false;
    for_each(line.begin(), line.end(), [&os, &output](const node_t &node) -> void {
        if(output) os << ",";
        output = true;
        os << node;
    });
    return os;
}

const vector<string> string_split(const string &str, const string &sep) {
    vector<string> result;
    regex pattern(sep);
    for_each(sregex_token_iterator(str.begin(), str.end(), pattern, -1), sregex_token_iterator(),
            [&result](const ssub_match &token) -> void {result.push_back(token);});
    return result;
}

const line_t get_line(const string &str) {
    line_t result;
    vector<string> v = string_split(string(str.begin(), str.end()), ",");
    for_each(v.begin(), v.end(), [&result](const string &s) -> void {
        vector<string> v = string_split(s, "=");
        result.push_back(node_t(v.begin(), v.end()));
    });
    return result;
}

istream &operator>>(istream &is, file_t &file) {
    file.clear();
    string s;
    while(getline(is, s)) {
        line_t line = get_line(string(s.begin() + 1, s.end() - 1));
        if(!any_of(file.begin(), file.end(), [&line](const line_t &l) -> bool {return line == l;}))
            file.push_back(line);
    }
    return is;
}

ostream &operator<<(ostream &os, const file_t &file) {
    for_each(file.begin(), file.end(), [&os](const line_t &line) -> void {
        os << "{" << line << "}" << endl;
    });
    return os;
}

int main() {
    file_t file; cin >> file;
    cout << file << endl;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 15:14:55 | 显示全部楼层
鱼cpython学习者 发表于 2022-8-9 11:54
我不太确定代码是不是百分百正确,我人工查看了几个,应该是对的
我把去重后的文本放到了新的文件叫B.txt
...

会多出空括号 "{}"
--- C.txt        2022-08-09 14:00:20.120425628 +0800
+++ B.txt        2022-08-09 15:13:12.026988112 +0800
@@ -3,8 +3,8 @@
 {TARIYALANG-VN=ER_E}
 {HADHVGVR=H0RM0YIBCITAN}
 {W1,NILH_A=HEUHED,BALCIR=HEUHED}
-{W2,NIRAI=HEUHED,SIN_E=HOMUN}
-{W2,VLAGAN=CAH_A,VLAGAN=NILH_A}
+{}
+{}
 {W2,VLAGAN=NILH_A,VLAGAN=CAH_A}
 {W2,HEUHED=BAGACVD,BAGACVD=HEUHED}
 {JALAGV=BAGACVD}
@@ -13,13 +13,13 @@
 {SEHEGETEN=JALAGVCVD}
 {IDE=NASV}
 {DVMDA=NASV}
-{W2,BUDUGUN=HOMUN,YEHE=ER_E,BUDUGUN=ER_E,T0M0=HOMUN,YEHE=HOMUN}
-{W2,YEHE=HOMUN,YEHE=ER_E,BUDUGUN=ER_E,T0M0=HOMUN,BUDUGUN=HOMUN}
+{}
+{}
 {W2,AHAMAD=NASVTAN,NASVTAI=HOMUN,OTELUGE=NASVTAN}
 {EBUGEN=HOGSIN}
-{W2,EBUGED=HOGSID,EBUGE=DEGEDUS}
+{}
 {EBUGED=OTEGUS}
-{W2,EBUGEN=ABV,NASVTAN=ABV}
+{}
 {EMEGEN=EJI}
 {OTEGUU=EBUGEN}
 {OTEGUS=YEHES}
@@ -30,49 +30,49 @@
 {MOGER=HAMARTV}
 {TAHIR=D0G0LANG}
 {HEBTERI-YIN=HOMUN}
-{HEI=S0LIYATV}
+{}
 {SAGVMAL=HOMUN}
 {EBEDCITEN=SIRHATAN}
 {BEY_E=UREGDEGSED}
 {W2,BEY_E=UREGDEGCI,UHUGSEN=HOMUN}
 {NOGCIGSEN=BAGATVR}
 {IJAGVR=VGSAG_A}
-{W1,IJAGVR=VDVM,VDVM=IJAGVR}
+{}
 {IJAGVR=VG}
 {NERETU=VGSAG_A}
 {UNDUSU=VGSAG_A}
 {W1,UNDUSU=IJAGVR,IJAGVR=0G,VG=IJAGVR}
 {VDVM=UNDUSU}
-{W1,VDVM=TOROL,VDVM=VGSAG_A}
+{}
 {W1,VDVM=IJAGVR,IJAGVR=VDVM}
 {W1,VDVM=VGSAG_A,VDVM=TOROL}
 {UNDUSUTEN=VGSAG_A}
 {UY_E=VGSAG_A}
 {UY_E=VDVM}
-{W1,VDVM=VG,VG=VDVM}
+{}
 {TVIRUL=VDVM}
 {W2,TOROL=VGSAG_A,VGSAG_A=TOROL}
 {W1,VG=VDVM,VDVM=VG}
 {VG=VGSAG_A}
 {VAGSAG_A=TOROL}
 {VGSAG_A=ESI}
-{W1,UR_E=VGSAG_A,UR_E=UNDUSU}
-{GER-UN=EJEGTEI}
+{}
+{}
 {W2,ER_E=HOMUN,EREGTEI=HOMUN,ER_E=HUISUTEN}
-{W2,BAG_A=EHENER,SVLA=HATVN,SVLA=EHENER,=TATABVRI=EHENER,TATABVRI=EM_E}
+{}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 15:22:59 | 显示全部楼层
鱼cpython学习者 发表于 2022-8-9 11:54
我不太确定代码是不是百分百正确,我人工查看了几个,应该是对的
我把去重后的文本放到了新的文件叫B.txt
...

谢谢您的回复,解决了这个问题呢,真的很感谢。

不过发现两个需要优化的问题呢:
1.C.txt中如果一个集合内就有一个词(没有逗号隔开)的话这种的集合我不想删除其重复项,就是这种就一个词构成一集合的不要删除其重复项,让它保留在原位置就行,这样的能解决吗?

2.我怀疑一些集合内(C.txt的一行内容内)也可能有重复的元素,所以想着在解决上述问题一的基础上,也删除一下每一行每个集合内的重复元素。

这样的话这个问题就圆满的解决咯,希望再看看这两个问题,期待你的回复。谢谢。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 15:31:42 | 显示全部楼层
人造人 发表于 2022-8-9 15:14
会多出空括号 "{}"

感谢您的回复,我学一学您的代码 哈哈哈 再次感谢,wish you have a nice day
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 15:54:58 | 显示全部楼层
Amgalang 发表于 2022-8-9 15:22
谢谢您的回复,解决了这个问题呢,真的很感谢。

不过发现两个需要优化的问题呢:

首先,我证明了
我们这两个程序的输出是等价的
我把我的代码改成这样
istream &operator>>(istream &is, file_t &file) {
    file.clear();
    string s;
    while(getline(is, s)) {
        line_t line = get_line(string(s.begin() + 1, s.end() - 1));
        if(!any_of(file.begin(), file.end(), [&line](const line_t &l) -> bool {return line == l;}))
            file.push_back(line);
        else {
            std::cerr << line << endl;
            exit(-1);
        }
    }
    return is;
}
然后用你的程序的输出作为我的程序的输入(已经删除了空括号)
运行我的程序发现没有出错退出,程序正常执行完成了
也就是说程序没有执行到else分支,就是没有重复的内容
而且你的程序和我的程序都输出了4834行内容
没有重复(如果有重复的话,我的程序会出错退出的),输出行数又一样,说明没有遗漏
说明我们这两个程序是等价的,我不知道我这样证明可不可以,我感觉可以,^_^

你的那两个问题,我研究研究
一会给你回复
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 16:34:50 | 显示全部楼层
人造人 发表于 2022-8-9 15:14
会多出空括号 "{}"

az,空括号不是他要求的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 16:36:24 | 显示全部楼层
鱼cpython学习者 发表于 2022-8-9 16:34
az,空括号不是他要求的吗

抱歉,没有认真看题,^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 16:36:36 | 显示全部楼层
Amgalang 发表于 2022-8-9 15:22
谢谢您的回复,解决了这个问题呢,真的很感谢。

不过发现两个需要优化的问题呢:

好吧,我再来想想
问一个问题,删除重复的元素要删哪一个?第一个还是最后一个,还是都删
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 16:37:06 | 显示全部楼层
人造人 发表于 2022-8-9 15:54
首先,我证明了
我们这两个程序的输出是等价的
我把我的代码改成这样

收到,感谢 感谢,充分感受到艺高人胆大和我要学习的必要性 哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 16:46:52 | 显示全部楼层
鱼cpython学习者 发表于 2022-8-9 16:36
好吧,我再来想想
问一个问题,删除重复的元素要删哪一个?第一个还是最后一个,还是都删

删除一个集合内重复元素时,删除一个集合内靠后的重复元素,例如:

{A,B,C,A,C}
那么输出结果是:
{A,B,C}(保持了原来的排序)

问题一若是很复杂的话 就不用管了,我刚刚从excel上筛选看后发现就那几个 所以没事咯 ,就是问题二了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 16:48:05 | 显示全部楼层
Amgalang 发表于 2022-8-9 16:46
删除一个集合内重复元素时,删除一个集合内靠后的重复元素,例如:

{A,B,C,A,C}

好吧,问题1反而是最简单的
我来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 16:56:56 | 显示全部楼层
人造人 发表于 2022-8-9 15:54
首先,我证明了
我们这两个程序的输出是等价的
我把我的代码改成这样

就解决问题二就可以咯,问题一 我excel解决了 哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 17:02:50 | 显示全部楼层
鱼cpython学习者 发表于 2022-8-9 16:48
好吧,问题1反而是最简单的
我来看看

哈哈哈 好吧
我刚写了个新手的代码,共参考,但 内容多后,代码一直跑,仅供参考:
>>> e = """
MVNDAG=ER_E,MVNDAG=ER_E
IDER=ER_E"""
>>> lst = e.split('\n')
>>> for i in lst:
        lst1 = i.split(',')
        d = list(set(lst1))
        d.sort(key=i.index)
        print(d)

       
['']
['MVNDAG=ER_E']
['IDER=ER_E']
>>>

还有一个网址,教学的:
https://blog.csdn.net/m0_46672151/article/details/115384780
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 17:05:21 | 显示全部楼层
Amgalang 发表于 2022-8-9 17:02
哈哈哈 好吧
我刚写了个新手的代码,共参考,但 内容多后,代码一直跑,仅供参考:
>>> e = """

我问一下, {A, B=C, B=D}这种,输出应该是什么?
是{A, B=C},还是不修改?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 17:09:32 | 显示全部楼层
这种的又如何处理呢?
{W2,TATABVRI=EM_E,SVLA=HATVN,SVLA=EHENER,=TATABVRI=EHENER,BAG_A=EHENER}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 17:24:27 | 显示全部楼层
鱼cpython学习者 发表于 2022-8-9 17:05
我问一下, {A, B=C, B=D}这种,输出应该是什么?
是{A, B=C},还是不修改?

这种输出不改。{A, B=C, B=D}正确呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 17:26:37 | 显示全部楼层
人造人 发表于 2022-8-9 17:09
这种的又如何处理呢?

这种的不处理,集合元素都不一样,逗号隔开一个词,“=”不用管,
例如:
{A, B=C, B=D}是正确的,不用处理,视作元素都不一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 04:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表