求助:如何用python脚本删除文本中的重复行(相同记录只保留一个)

求助:如何用python脚本删除文本中的重复行(相同记录只保留一个)

我有个纯文本的词汇表,日积月累,里面有好多重复行。

请问如何写个python脚本,删除其中的重复行(相同记录只保留一个)。

非常感谢。
我给你个小例子把:
>>> arr=['aaa','bbb','ccc','aaa','ddd','bbb']
>>> a1=set(arr)
>>> a2=[i for i in a1]
>>> a2
['aaa', 'bbb', 'ccc', 'ddd']

可以去除重复的元素。
当然你也可以用字典来做,把每一行值作为索引,随后输出字段的所有keys就行了,也去除了重复

还可以定义个数组,循环文件的行,如果某行不在数组内,就append进去,在就跳过。这个也可以搞定

open('newdict.txt', 'w').write(''.join(set(open('dic.txt').readlines())))
差不多就这样吧
为什么不 sort|uniq ?
用 set 不错。但用 set 未必能保持顺序:

测试文件 data

[Copy to clipboard] [ - ]
CODE:
foo
bar
foo
foo
bar
quo



[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python                                                           

rfd=file("data","r")
wfd=file("newdata", "w")
s=set()

for i in rfd:
    s.add(i)

for i in s:
    wfd.write(i)

生成的新文件:newdata

[Copy to clipboard] [ - ]
CODE:
quo
bar
foo

如果想保持顺序,可以用 hash 表进行判断。

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python                                                           

rfd=file("data","r")
wfd=file("newdata", "w")
h={}
for i in rfd:
    if not h.has_key(i):
        h[i]=1
        wfd.write(i)

产生的文件 newdata

[Copy to clipboard] [ - ]
CODE:
foo
bar
quo

虽然没什么实际意义,不过即使想保持顺序,2句话也还是可以的
#!/usr/bin/env python

lines, sorted = open('dic', 'r').readlines(), lambda a, cmp: a.sort(cmp=cmp) or a
open('newdic', 'w').write(''.join([l[0] for l in sorted([(l, lines.index(l)) for l in set(lines)], lambda a,b: a[1]-b[1] )]))


楼上的代码看不懂,能不能解释一下? 我的方案要短也可以,看下面:

[Copy to clipboard] [ - ]
CODE:
h,r,w ={}, file('data'), file('newdata','w')
w.write(reduce(lambda x,y:x+y, [i for i in r if h.get(i)==None and h.setdefault(i, True)]))

一个用 set 的版本:

[Copy to clipboard] [ - ]
CODE:
s,r=set(), file('data')
print [i for i in r if not (i in s or s.add(i))]

或可读性好一点的

[Copy to clipboard] [ - ]
CODE:
s,r=set(), file('data')
print [i for i in r if i not in s and s.add(i)==None]



QUOTE:
a2=[i for i in a1]

这句的目的是??


QUOTE:
原帖由 realmon 于 2008-8-23 10:13 发表

这句的目的是??



[Copy to clipboard] [ - ]
CODE:
x=[1,2,3,4]
y=[i for i in x]
print y



QUOTE:
[1,2,3,4]

可以做个映射

[Copy to clipboard] [ - ]
CODE:
z=[i**2 for i in x]
print z



QUOTE:
[1,4,9, 16]

回到你的问题:

a1 是个集合, a2 是个列表。当然就是从集合生成列表了。