Amgalang 发表于 2022-8-9 10:25:18

txt文件中删除重复项的问题 求助

上午好,

我上传的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}
那么这两个集合不算重复项。

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

鱼cpython学习者 发表于 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 or item in new_data:
    data = '{}\n'
    new_data = ''
with open('B.txt', 'w', encoding='utf-8') as f:
f.writelines(data)

Amgalang 发表于 2022-8-9 10:29:14

人造人 发表于 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;
}

人造人 发表于 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}
+{}

Amgalang 发表于 2022-8-9 15:22:59

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

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

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

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

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

Amgalang 发表于 2022-8-9 15:31:42

人造人 发表于 2022-8-9 15:14
会多出空括号 "{}"

感谢您的回复,我学一学您的代码 哈哈哈 再次感谢,wish you have a nice day

人造人 发表于 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行内容
没有重复(如果有重复的话,我的程序会出错退出的),输出行数又一样,说明没有遗漏
说明我们这两个程序是等价的,我不知道我这样证明可不可以,我感觉可以,^_^

你的那两个问题,我研究研究
一会给你回复
^_^

鱼cpython学习者 发表于 2022-8-9 16:34:50

人造人 发表于 2022-8-9 15:14
会多出空括号 "{}"

az,空括号不是他要求的吗{:10_245:}

人造人 发表于 2022-8-9 16:36:24

鱼cpython学习者 发表于 2022-8-9 16:34
az,空括号不是他要求的吗

抱歉,没有认真看题,^_^

鱼cpython学习者 发表于 2022-8-9 16:36:36

Amgalang 发表于 2022-8-9 15:22
谢谢您的回复,解决了这个问题呢,真的很感谢。

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


好吧,我再来想想
问一个问题,删除重复的元素要删哪一个?第一个还是最后一个,还是都删

Amgalang 发表于 2022-8-9 16:37:06

人造人 发表于 2022-8-9 15:54
首先,我证明了
我们这两个程序的输出是等价的
我把我的代码改成这样


收到,感谢 感谢,充分感受到艺高人胆大和我要学习的必要性 哈哈哈

Amgalang 发表于 2022-8-9 16:46:52

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

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

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

问题一若是很复杂的话 就不用管了,我刚刚从excel上筛选看后发现就那几个 所以没事咯 ,就是问题二了。

鱼cpython学习者 发表于 2022-8-9 16:48:05

Amgalang 发表于 2022-8-9 16:46
删除一个集合内重复元素时,删除一个集合内靠后的重复元素,例如:

{A,B,C,A,C}


好吧,问题1反而是最简单的{:10_285:}
我来看看

Amgalang 发表于 2022-8-9 16:56:56

人造人 发表于 2022-8-9 15:54
首先,我证明了
我们这两个程序的输出是等价的
我把我的代码改成这样


就解决问题二就可以咯,问题一 我excel解决了 哈哈哈

Amgalang 发表于 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

鱼cpython学习者 发表于 2022-8-9 17:05:21

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


我问一下, {A, B=C, B=D}这种,输出应该是什么?
是{A, B=C},还是不修改?

人造人 发表于 2022-8-9 17:09:32

这种的又如何处理呢?
{W2,TATABVRI=EM_E,SVLA=HATVN,SVLA=EHENER,=TATABVRI=EHENER,BAG_A=EHENER}

Amgalang 发表于 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}正确呢。

Amgalang 发表于 2022-8-9 17:26:37

人造人 发表于 2022-8-9 17:09
这种的又如何处理呢?

这种的不处理,集合元素都不一样,逗号隔开一个词,“=”不用管,
例如:
{A, B=C, B=D}是正确的,不用处理,视作元素都不一样。
页: [1] 2
查看完整版本: txt文件中删除重复项的问题 求助