鱼C论坛

 找回密码
 立即注册
查看: 5934|回复: 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
  1. import re
  2. with open('C.txt', 'r', encoding='utf-8') as f:
  3.   data = f.readlines()
  4. new_data = []
  5. for item in data:
  6.   item = item.strip()
  7.   sorted_item = sorted(re.sub(r'[\{|\}]', '', item).split(','))
  8.   new_data.append(','.join(sorted_item))
  9. for index, item in enumerate(new_data):
  10.   if item in new_data[0:index] or item in new_data[index+1:]:
  11.     data[index] = '{}\n'
  12.     new_data[index] = ''
  13. with open('B.txt', 'w', encoding='utf-8') as f:
  14.   f.writelines(data)
复制代码

最佳答案

查看完整内容

我不太确定代码是不是百分百正确,我人工查看了几个,应该是对的 我把去重后的文本放到了新的文件叫B.txt
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2022-8-9 10:29:14 | 显示全部楼层
C.txt (149.86 KB, 下载次数: 10)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  6. using std::cin, std::cout, std::endl;
  7. using std::vector, std::string;
  8. using std::equal, std::any_of, std::for_each;
  9. using std::istream, std::ostream;
  10. using std::getline;
  11. using std::regex, std::ssub_match, std::sregex_token_iterator;

  12. using node_t = vector<string>;
  13. using line_t = vector<node_t>;
  14. using file_t = vector<line_t>;

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

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

  26. ostream &operator<<(ostream &os, const node_t &node) {
  27.     bool output = false;
  28.     for_each(node.begin(), node.end(), [&os, &output](const string &str) -> void {
  29.         if(output) os << "=";
  30.         output = true;
  31.         os << str;
  32.     });
  33.     return os;
  34. }

  35. ostream &operator<<(ostream &os, const line_t &line) {
  36.     bool output = false;
  37.     for_each(line.begin(), line.end(), [&os, &output](const node_t &node) -> void {
  38.         if(output) os << ",";
  39.         output = true;
  40.         os << node;
  41.     });
  42.     return os;
  43. }

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

  51. const line_t get_line(const string &str) {
  52.     line_t result;
  53.     vector<string> v = string_split(string(str.begin(), str.end()), ",");
  54.     for_each(v.begin(), v.end(), [&result](const string &s) -> void {
  55.         vector<string> v = string_split(s, "=");
  56.         result.push_back(node_t(v.begin(), v.end()));
  57.     });
  58.     return result;
  59. }

  60. istream &operator>>(istream &is, file_t &file) {
  61.     file.clear();
  62.     string s;
  63.     while(getline(is, s)) {
  64.         line_t line = get_line(string(s.begin() + 1, s.end() - 1));
  65.         if(!any_of(file.begin(), file.end(), [&line](const line_t &l) -> bool {return line == l;}))
  66.             file.push_back(line);
  67.     }
  68.     return is;
  69. }

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

  76. int main() {
  77.     file_t file; cin >> file;
  78.     cout << file << endl;
  79.     return 0;
  80. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

会多出空括号 "{}"

  1. --- C.txt        2022-08-09 14:00:20.120425628 +0800
  2. +++ B.txt        2022-08-09 15:13:12.026988112 +0800
  3. @@ -3,8 +3,8 @@
  4. {TARIYALANG-VN=ER_E}
  5. {HADHVGVR=H0RM0YIBCITAN}
  6. {W1,NILH_A=HEUHED,BALCIR=HEUHED}
  7. -{W2,NIRAI=HEUHED,SIN_E=HOMUN}
  8. -{W2,VLAGAN=CAH_A,VLAGAN=NILH_A}
  9. +{}
  10. +{}
  11. {W2,VLAGAN=NILH_A,VLAGAN=CAH_A}
  12. {W2,HEUHED=BAGACVD,BAGACVD=HEUHED}
  13. {JALAGV=BAGACVD}
  14. @@ -13,13 +13,13 @@
  15. {SEHEGETEN=JALAGVCVD}
  16. {IDE=NASV}
  17. {DVMDA=NASV}
  18. -{W2,BUDUGUN=HOMUN,YEHE=ER_E,BUDUGUN=ER_E,T0M0=HOMUN,YEHE=HOMUN}
  19. -{W2,YEHE=HOMUN,YEHE=ER_E,BUDUGUN=ER_E,T0M0=HOMUN,BUDUGUN=HOMUN}
  20. +{}
  21. +{}
  22. {W2,AHAMAD=NASVTAN,NASVTAI=HOMUN,OTELUGE=NASVTAN}
  23. {EBUGEN=HOGSIN}
  24. -{W2,EBUGED=HOGSID,EBUGE=DEGEDUS}
  25. +{}
  26. {EBUGED=OTEGUS}
  27. -{W2,EBUGEN=ABV,NASVTAN=ABV}
  28. +{}
  29. {EMEGEN=EJI}
  30. {OTEGUU=EBUGEN}
  31. {OTEGUS=YEHES}
  32. @@ -30,49 +30,49 @@
  33. {MOGER=HAMARTV}
  34. {TAHIR=D0G0LANG}
  35. {HEBTERI-YIN=HOMUN}
  36. -{HEI=S0LIYATV}
  37. +{}
  38. {SAGVMAL=HOMUN}
  39. {EBEDCITEN=SIRHATAN}
  40. {BEY_E=UREGDEGSED}
  41. {W2,BEY_E=UREGDEGCI,UHUGSEN=HOMUN}
  42. {NOGCIGSEN=BAGATVR}
  43. {IJAGVR=VGSAG_A}
  44. -{W1,IJAGVR=VDVM,VDVM=IJAGVR}
  45. +{}
  46. {IJAGVR=VG}
  47. {NERETU=VGSAG_A}
  48. {UNDUSU=VGSAG_A}
  49. {W1,UNDUSU=IJAGVR,IJAGVR=0G,VG=IJAGVR}
  50. {VDVM=UNDUSU}
  51. -{W1,VDVM=TOROL,VDVM=VGSAG_A}
  52. +{}
  53. {W1,VDVM=IJAGVR,IJAGVR=VDVM}
  54. {W1,VDVM=VGSAG_A,VDVM=TOROL}
  55. {UNDUSUTEN=VGSAG_A}
  56. {UY_E=VGSAG_A}
  57. {UY_E=VDVM}
  58. -{W1,VDVM=VG,VG=VDVM}
  59. +{}
  60. {TVIRUL=VDVM}
  61. {W2,TOROL=VGSAG_A,VGSAG_A=TOROL}
  62. {W1,VG=VDVM,VDVM=VG}
  63. {VG=VGSAG_A}
  64. {VAGSAG_A=TOROL}
  65. {VGSAG_A=ESI}
  66. -{W1,UR_E=VGSAG_A,UR_E=UNDUSU}
  67. -{GER-UN=EJEGTEI}
  68. +{}
  69. +{}
  70. {W2,ER_E=HOMUN,EREGTEI=HOMUN,ER_E=HUISUTEN}
  71. -{W2,BAG_A=EHENER,SVLA=HATVN,SVLA=EHENER,=TATABVRI=EHENER,TATABVRI=EM_E}
  72. +{}
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

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

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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

感谢您的回复,我学一学您的代码 哈哈哈 再次感谢,wish you have a nice day
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

首先,我证明了
我们这两个程序的输出是等价的
我把我的代码改成这样
  1. istream &operator>>(istream &is, file_t &file) {
  2.     file.clear();
  3.     string s;
  4.     while(getline(is, s)) {
  5.         line_t line = get_line(string(s.begin() + 1, s.end() - 1));
  6.         if(!any_of(file.begin(), file.end(), [&line](const line_t &l) -> bool {return line == l;}))
  7.             file.push_back(line);
  8.         else {
  9.             std::cerr << line << endl;
  10.             exit(-1);
  11.         }
  12.     }
  13.     return is;
  14. }
复制代码

然后用你的程序的输出作为我的程序的输入(已经删除了空括号)
运行我的程序发现没有出错退出,程序正常执行完成了
也就是说程序没有执行到else分支,就是没有重复的内容
而且你的程序和我的程序都输出了4834行内容
没有重复(如果有重复的话,我的程序会出错退出的),输出行数又一样,说明没有遗漏
说明我们这两个程序是等价的,我不知道我这样证明可不可以,我感觉可以,^_^

你的那两个问题,我研究研究
一会给你回复
^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

az,空括号不是他要求的吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

抱歉,没有认真看题,^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

好吧,我再来想想
问一个问题,删除重复的元素要删哪一个?第一个还是最后一个,还是都删
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

收到,感谢 感谢,充分感受到艺高人胆大和我要学习的必要性 哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

问题一若是很复杂的话 就不用管了,我刚刚从excel上筛选看后发现就那几个 所以没事咯 ,就是问题二了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

{A,B,C,A,C}

好吧,问题1反而是最简单的
我来看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

就解决问题二就可以咯,问题一 我excel解决了 哈哈哈
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

我问一下, {A, B=C, B=D}这种,输出应该是什么?
是{A, B=C},还是不修改?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-9 17:09:32 | 显示全部楼层
这种的又如何处理呢?
  1. {W2,TATABVRI=EM_E,SVLA=HATVN,SVLA=EHENER,=TATABVRI=EHENER,BAG_A=EHENER}
复制代码
小甲鱼最新课程 -> https://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}正确呢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

这种的不处理,集合元素都不一样,逗号隔开一个词,“=”不用管,
例如:
{A, B=C, B=D}是正确的,不用处理,视作元素都不一样。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 17:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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