python查找重复字符串并合并数据

NA_QUEEN 2017-09-14 02:20:52
求助各位大侠,先拜谢~~~
我有一个文件,格式是这样,简单贴几行:
阿姨 大姨|姨妈|姨娘|
阿姨 姨妈|姨母
阿諛 讨好|奉承
阿谀 奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承 趋炎附势|


我想得到这样的:
阿姨 大姨|姨妈|姨娘|姨母
阿諛 讨好|奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承 趋炎附势|


如果制表符前面的关键词相同,就将后面的同义词部分合并并去除重复。

我的思路:
1.读一行数据,将制表符前后的分别存为两个list
2.读下一行数据,将制表符前后的数据分别存为两个list
3.如果前两步中制表符前面的list相同,则将制表符后面的两个list合并并排重。
4.如果不同,原样输出。
5.将‘阿姨’和’后面排重后的list重新组成一行,输出。

好不容易有思路,但是写起来好困难。。。。

请教各位大侠,我这个思路可以实现吗?如果可以我就试试,因为是新手,每一步都需要现学现用,所以会很耽误时间。。。。
如果思路有问题,或者效率太低,望大侠们指点一二,谢谢!!!!!!
...全文
1476 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
NA_QUEEN 2017-09-15
  • 打赏
  • 举报
回复
感谢各位出谋划策,问题解决了,以后还得好好学习,多多练习。 分数不多,是份心意,再次感谢!
NA_QUEEN 2017-09-15
  • 打赏
  • 举报
回复
引用 11 楼 xpresslink 的回复:
[quote=引用 10 楼 NANA170110 的回复:] 我想把结果直接输出到一个文件中,结果文件中是乱码,请问格式化输出的结果可以这样输出到文件吗?
你用的python3 还是2 是在Linux 下还是 Windows? 文本方式打开文件时候要对应指定encoding,或直接二进制直接写字节码。[/quote] 我用的Python2, 解决啦,就是打开文件的时候忘记了encoding,多谢!!!
混沌鳄鱼 2017-09-15
  • 打赏
  • 举报
回复
引用 10 楼 NANA170110 的回复:
我想把结果直接输出到一个文件中,结果文件中是乱码,请问格式化输出的结果可以这样输出到文件吗?
你用的python3 还是2 是在Linux 下还是 Windows? 文本方式打开文件时候要对应指定encoding,或直接二进制直接写字节码。
NA_QUEEN 2017-09-15
  • 打赏
  • 举报
回复
引用 7 楼 xpresslink 的回复:


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
from collections import defaultdict
from operator import itemgetter

word_text = """
阿姨    大姨|姨妈|姨娘|
阿姨    姨妈|姨母
阿諛    讨好|奉承
阿谀    奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承        趋炎附势|
"""

ptn = re.compile(r'(?:[\s|]+)')

word_dict = defaultdict(set)
for line in word_text.splitlines():
    words = ptn.split(line.strip('|'))
    if len(words) > 1:
        word_dict[words[0]].update(words[1:])

for key, words in sorted(word_dict.items(), key=itemgetter(0)):
    print('{0}   {1}'.format(key, '|'.join(words)))

C:\Python36\python.exe D:/OneDrive/PyProjects/Python3_Study/combine_words.py 阿姨 姨母|大姨|姨娘|姨妈 阿諛 奉承|讨好 阿谀 迎阿|奉承|逢迎|献媚|谄媚|巴结|谄谀|谀媚|趋奉|恭维|讨好 阿谀奉承 趋炎附势 Process finished with exit code 0
#!/usr/bin/python
#-*- coding: utf-8 -*-

import re
from collections import defaultdict
from operator import itemgetter
import sys
reload (sys)
sys.setdefaultencoding('utf-8')

syns_file = open('./test.txt','r')
#syns_file = open('./all_wiki_baidu_syns.txt','r')
sort_syns_file = open('./all_wiki_baidu_syns_sort.txt','w+')

pattern = re.compile(r'(?:[\s|]+)')
word_dict = defaultdict(set)

for each_line in syns_file.readlines():
	line = each_line.strip('\n')
	words = pattern.split(line.strip('|'))
	if len(words) > 1:
		word_dict[words[0]].update(words[1:])

for key,words in sorted(word_dict.items(),key = itemgetter(0)):
	sort_syns_file.write('{0}	{1}\n'.format(key,'|'.join(words)))
	#print ('{0}	{1}\n'.format(key,'|'.join(words)))

	
syns_file.close()
#sort_syns_file.close()
我想把结果直接输出到一个文件中,结果文件中是乱码,请问格式化输出的结果可以这样输出到文件吗?
NA_QUEEN 2017-09-15
  • 打赏
  • 举报
回复
引用 7 楼 xpresslink 的回复:


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
from collections import defaultdict
from operator import itemgetter

word_text = """
阿姨    大姨|姨妈|姨娘|
阿姨    姨妈|姨母
阿諛    讨好|奉承
阿谀    奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承        趋炎附势|
"""

ptn = re.compile(r'(?:[\s|]+)')

word_dict = defaultdict(set)
for line in word_text.splitlines():
    words = ptn.split(line.strip('|'))
    if len(words) > 1:
        word_dict[words[0]].update(words[1:])

for key, words in sorted(word_dict.items(), key=itemgetter(0)):
    print('{0}   {1}'.format(key, '|'.join(words)))

C:\Python36\python.exe D:/OneDrive/PyProjects/Python3_Study/combine_words.py 阿姨 姨母|大姨|姨娘|姨妈 阿諛 奉承|讨好 阿谀 迎阿|奉承|逢迎|献媚|谄媚|巴结|谄谀|谀媚|趋奉|恭维|讨好 阿谀奉承 趋炎附势 Process finished with exit code 0
棒!成功了~~ 挨个学习了一下脚本内容,有个疑问想请教: pattern = re.compile(r'(?:[\s|]+)') 这个正则当中的?:代表的是什么呢?不太明白~
sanGuo_uu 2017-09-14
  • 打赏
  • 举报
回复
写起来当然困难了,3层循环嵌套
# -*- coding: utf-8 -*-

import re

txt="""
阿姨    大姨|姨妈|姨娘|
阿姨    姨妈|姨母
阿谀    讨好|奉承
阿谀    奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承        趋炎附势|
"""

txtList=txt.split('\n')
result=[]
resTxt=''
p = re.compile(r'|$')

for line in txtList:
	if line=='':
		continue
	tmp=re.split('\s+',line)
	first=tmp[0]
	second=p.sub('', tmp[1])
	lenr=len(result)
	if lenr==0:
		result.append([first,second])
		continue
	count=0
	for item in result:
		if first==item[0]:
			tmpSecond=re.split('|',second)
			for sec in tmpSecond:
				if sec not in item[1]:
					item[1]+='|'+sec
			break
		count+=1
		if count==lenr:
			result.append([first,second])

for item in result:
	resTxt+=item[0]+'   '+item[1]+'\n'
print(resTxt)
混沌鳄鱼 2017-09-14
  • 打赏
  • 举报
回复


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
from collections import defaultdict
from operator import itemgetter

word_text = """
阿姨    大姨|姨妈|姨娘|
阿姨    姨妈|姨母
阿諛    讨好|奉承
阿谀    奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承        趋炎附势|
"""

ptn = re.compile(r'(?:[\s|]+)')

word_dict = defaultdict(set)
for line in word_text.splitlines():
    words = ptn.split(line.strip('|'))
    if len(words) > 1:
        word_dict[words[0]].update(words[1:])

for key, words in sorted(word_dict.items(), key=itemgetter(0)):
    print('{0}   {1}'.format(key, '|'.join(words)))

C:\Python36\python.exe D:/OneDrive/PyProjects/Python3_Study/combine_words.py 阿姨 姨母|大姨|姨娘|姨妈 阿諛 奉承|讨好 阿谀 迎阿|奉承|逢迎|献媚|谄媚|巴结|谄谀|谀媚|趋奉|恭维|讨好 阿谀奉承 趋炎附势 Process finished with exit code 0
NA_QUEEN 2017-09-14
  • 打赏
  • 举报
回复
引用 5 楼 zhmwang2008 的回复:
用字典吧,‘阿姨’ 做key,有就合并,没有就添加
多谢~ 刚学Python,最头疼的就是字典还不会用,我再去学习一下,多谢啦~~~
张强1990 2017-09-14
  • 打赏
  • 举报
回复
用字典吧,‘阿姨’ 做key,有就合并,没有就添加
NA_QUEEN 2017-09-14
  • 打赏
  • 举报
回复
引用 3 楼 zhmwang2008 的回复:

import pandas as pd

df = pd.read_table("test.txt", sep='\s+', encoding='utf-8', index_col=0, header=None)

df
Out[229]: 
                                      1
0                                      
阿姨                            大姨|姨妈|姨娘|
阿姨                                姨妈|姨母
阿諛                                讨好|奉承
阿谀    奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承                               趋炎附势

groupd = df.groupby(level=0)

df2 = groupd.sum()

df2
Out[232]: 
                                      1
0                                      
阿姨                       大姨|姨妈|姨娘|姨妈|姨母
阿諛                                讨好|奉承
阿谀    奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承                               趋炎附势
厉害~~~ 这个包好牛啊,我木有pandas包,下一个去~~~ 再弱弱地问一句~ 如果不用这个包的话,好处理吗?
张强1990 2017-09-14
  • 打赏
  • 举报
回复

import pandas as pd

df = pd.read_table("test.txt", sep='\s+', encoding='utf-8', index_col=0, header=None)

df
Out[229]: 
                                      1
0                                      
阿姨                            大姨|姨妈|姨娘|
阿姨                                姨妈|姨母
阿諛                                讨好|奉承
阿谀    奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承                               趋炎附势

groupd = df.groupby(level=0)

df2 = groupd.sum()

df2
Out[232]: 
                                      1
0                                      
阿姨                       大姨|姨妈|姨娘|姨妈|姨母
阿諛                                讨好|奉承
阿谀    奉承|巴结|恭维|献媚|讨好|谀媚|谄媚|谄谀|趋奉|迎阿|逢迎|
阿谀奉承                               趋炎附势
NA_QUEEN 2017-09-14
  • 打赏
  • 举报
回复
引用 1 楼 zhmwang2008 的回复:
你有算法判断什么算同义词吗
我有一个同义词列表,就是列举那几行那样的格式,只判断字符串是否一致就可以了,不用再判断是不是同义词了~
张强1990 2017-09-14
  • 打赏
  • 举报
回复
你有算法判断什么算同义词吗

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧