如果有 33W 行文字,去重应该怎么写呢?

2017-12-17 00:22:49 +08:00
 warcraft1236

比如有个 txt 文本,一共有 33W 行文字,以行作为单位,去重,我应该怎么写效率会比较高呢?

我目前用的普通的方法,发现耗时比较长

我列出我目前的方法

    with open('/Users/lizhao/Downloads/aboutchinese.dict.yaml') as f:

        for i in f.readlines():
            if i == '\n':
                continue
            if i not in oldList:
                oldList.append(i)

    with open('tmp.txt','w') as g:
        g.writelines(oldList)

代码渣,请轻喷

6512 次点击
所在节点    Python
44 条回复
ceclinux
2017-12-17 09:01:01 +08:00
要是对结果没有顺序要求的,不要想太多,直接 sort 然后 uniq 即可
fyibmsd
2017-12-17 10:31:45 +08:00
cat old | uniq | tee new
artandlol
2017-12-17 10:44:36 +08:00
一个 uniq 也能发一贴
root@x:~# cat test
247
214
209
228
216
216
root@x:~# cat test|uniq
247
214
209
228
216
root@x:~# cat test|sort -u
209
214
216
228
247
root@x:~# cat test|awk '!a[$0]++'
247
214
209
228
216
ericls
2017-12-17 10:47:05 +08:00
from collections import OrderedDict
'\n'.join(OrderedDict.fromkeys(string.splitlines()))
selfAccomplish
2017-12-17 10:51:26 +08:00
如果楼主的数据是在 window 下面呢,没有 linux 的机子或者数据量大拷不进 linux 的虚拟机。
cdwyd
2017-12-17 10:53:50 +08:00
list(set(f.readlines()))
takeoffyoung
2017-12-17 11:08:28 +08:00
cat xxx.txt | sort | uniq 这样??
msg7086
2017-12-17 11:23:32 +08:00
@selfAccomplish 那就在 Windows 下用 awk 啊。
anexplore
2017-12-17 11:41:29 +08:00
1、for i in f.readlines() 改成 for i in f: 是不是更好;
2、查重用 dict 性能好,如果每一行都比较长 建议把 line 换算一下再 put 到 dict 中,要保证顺序就 orderdict
young6
2017-12-17 12:58:22 +08:00
要是对行顺序没要求,用 cat,sort,uniq 吧,还写啥代码啊。要是行顺序要求不变,python 有有序字典
leavic
2017-12-17 16:31:34 +08:00
有序字典吧,set 虽然可以去重,但你恢复的时候就无序了。
wizardoz
2017-12-17 16:35:42 +08:00
dict 可破,用文本当 key,用行号当 value
dict 在判断 in 的时候效率应该吊打 list。
jyf007
2017-12-17 20:55:58 +08:00
@msg7086
@artandlol
@young6
@selfAccomplish
@swulling
@ioven
@rrfeng

别忘了用这个 https://frippery.org/busybox/
,开一个批处理写成 busybox ash 就有坠吼的环境了,(其实没什么大功能)
我原来写了一个在 windows 处理 netstat 输出的就是这么骚操作.
artandlol
2017-12-17 21:04:36 +08:00
@jyf007
cmder
+gow
或者用在线 docker-ce 再通过用 websocket 映射到浏览器
估计你要百度一晚上了
jyf007
2017-12-17 21:42:58 +08:00
@artandlol 说起来 unix 的好还是只能体现在 busybox 上了,其他不能算是原始的 unix 了
我当时是直接操作 cmd 的窗口就这 vi 写脚本,或者开记事本搞,
完整的 msys2 我装完有 45G 这么大,不够轻盈,
我觉得安利 unix 必须提 busybox 和 dropbear.
warcraft1236
2017-12-17 21:47:41 +08:00
@wizardoz

能给个示例吗?我不知道该怎么用 dict 去重
ipwx
2017-12-17 23:18:59 +08:00
24L 是 Python 最优雅的解决方案。
Lpl
2017-12-17 23:56:50 +08:00
vim 文件

然后 :sort u
会先排序然后取相同行第一行
lylijincheng
2017-12-18 09:15:55 +08:00
```
Array.from(new Set(longlongtext.split(''))).join('')
```
wizardoz
2017-12-18 09:45:31 +08:00
@warcraft1236 把你的 list 换成 dict 就可以了!

buffer = {}
sort_key = 0
with open('file.txt', 'r') as fp:
for line in fp.readlines():
if line not in buffer:
sort_key += 1
buffer[line] = sort_key


# 完了用 sort_key 排序,保持原来顺序
...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/415377

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX