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}
那么这两个集合不算重复项。
数据有点多,人工看来看去 不能保证前后一致了,所以想求大佬帮一下。谢谢。
我不太确定代码是不是百分百正确,我人工查看了几个,应该是对的
我把去重后的文本放到了新的文件叫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) 这题目挺有意思,我也来玩玩,^_^
#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;
}
鱼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}
+{}
鱼cpython学习者 发表于 2022-8-9 11:54
我不太确定代码是不是百分百正确,我人工查看了几个,应该是对的
我把去重后的文本放到了新的文件叫B.txt
...
谢谢您的回复,解决了这个问题呢,真的很感谢。
不过发现两个需要优化的问题呢:
1.C.txt中如果一个集合内就有一个词(没有逗号隔开)的话这种的集合我不想删除其重复项,就是这种就一个词构成一集合的不要删除其重复项,让它保留在原位置就行,这样的能解决吗?
2.我怀疑一些集合内(C.txt的一行内容内)也可能有重复的元素,所以想着在解决上述问题一的基础上,也删除一下每一行每个集合内的重复元素。
这样的话这个问题就圆满的解决咯,希望再看看这两个问题,期待你的回复。谢谢。
人造人 发表于 2022-8-9 15:14
会多出空括号 "{}"
感谢您的回复,我学一学您的代码 哈哈哈 再次感谢,wish you have a nice day 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行内容
没有重复(如果有重复的话,我的程序会出错退出的),输出行数又一样,说明没有遗漏
说明我们这两个程序是等价的,我不知道我这样证明可不可以,我感觉可以,^_^
你的那两个问题,我研究研究
一会给你回复
^_^
人造人 发表于 2022-8-9 15:14
会多出空括号 "{}"
az,空括号不是他要求的吗{:10_245:} 鱼cpython学习者 发表于 2022-8-9 16:34
az,空括号不是他要求的吗
抱歉,没有认真看题,^_^
Amgalang 发表于 2022-8-9 15:22
谢谢您的回复,解决了这个问题呢,真的很感谢。
不过发现两个需要优化的问题呢:
好吧,我再来想想
问一个问题,删除重复的元素要删哪一个?第一个还是最后一个,还是都删 人造人 发表于 2022-8-9 15:54
首先,我证明了
我们这两个程序的输出是等价的
我把我的代码改成这样
收到,感谢 感谢,充分感受到艺高人胆大和我要学习的必要性 哈哈哈 鱼cpython学习者 发表于 2022-8-9 16:36
好吧,我再来想想
问一个问题,删除重复的元素要删哪一个?第一个还是最后一个,还是都删
删除一个集合内重复元素时,删除一个集合内靠后的重复元素,例如:
{A,B,C,A,C}
那么输出结果是:
{A,B,C}(保持了原来的排序)
问题一若是很复杂的话 就不用管了,我刚刚从excel上筛选看后发现就那几个 所以没事咯 ,就是问题二了。 Amgalang 发表于 2022-8-9 16:46
删除一个集合内重复元素时,删除一个集合内靠后的重复元素,例如:
{A,B,C,A,C}
好吧,问题1反而是最简单的{:10_285:}
我来看看 人造人 发表于 2022-8-9 15:54
首先,我证明了
我们这两个程序的输出是等价的
我把我的代码改成这样
就解决问题二就可以咯,问题一 我excel解决了 哈哈哈 鱼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 Amgalang 发表于 2022-8-9 17:02
哈哈哈 好吧
我刚写了个新手的代码,共参考,但 内容多后,代码一直跑,仅供参考:
>>> e = """
我问一下, {A, B=C, B=D}这种,输出应该是什么?
是{A, B=C},还是不修改? 这种的又如何处理呢?
{W2,TATABVRI=EM_E,SVLA=HATVN,SVLA=EHENER,=TATABVRI=EHENER,BAG_A=EHENER}
鱼cpython学习者 发表于 2022-8-9 17:05
我问一下, {A, B=C, B=D}这种,输出应该是什么?
是{A, B=C},还是不修改?
这种输出不改。{A, B=C, B=D}正确呢。 人造人 发表于 2022-8-9 17:09
这种的又如何处理呢?
这种的不处理,集合元素都不一样,逗号隔开一个词,“=”不用管,
例如:
{A, B=C, B=D}是正确的,不用处理,视作元素都不一样。
页:
[1]
2