我正在寻找this的高级版本。
基本上,如果我有一个带文字的文件:
abc
ghi
fed
jkl
abc
ghi
fed
我希望输出为:(对于n=3
)
Duplicated Lines
abc
ghi
fed
Times = 2
答案 0 :(得分:1)
一种方法是根据你的n
分割你的文本,然后计算所有依赖于这个计数的元素的数量,你可以使用一些在python中使用散列表如字典的数据结构,这对于这样的任务。
任务是创建一个字典,使字符保持唯一,然后循环遍历分割文本列表,并在每次看到重复项时增加每个项目的计数。
最后,您将拥有一个字典,其中包含唯一的项目,这些项目将计为字典值。
像python这样的langs提供了很好的工具,如Counter
,用于计算可迭代中的元素,islice
用于切片和迭代,返回生成器,对于长迭代非常有效:
>>> from collections import Counter
>>> from itertools import islice
>>> s="""abc
... ghi
... fed
... jkl
... abc
... ghi
... fed"""
>>> sp=s.split()
>>> Counter('\n'.join(islice(sp,i,i+3)) for i in range(len(sp)))
Counter({'abc\nghi\nfed': 2, 'fed': 1, 'jkl\nabc\nghi': 1, 'ghi\nfed': 1, 'fed\njkl\nabc': 1, 'ghi\nfed\njkl': 1})
或者你可以自定义:
>>> a=['\n'.join(sp[i:i+3] for i in range(len(sp))]
>>> a
['abc\nghi\nfed', 'ghi\nfed\njkl', 'fed\njkl\nabc', 'jkl\nabc\nghi', 'abc\nghi\nfed', 'ghi\nfed', 'fed']
>>> d={}
>>> for i in a:
... if i in d:
... d[i]+=1
... else :
... d[i]=1
...
>>> d
{'fed': 1, 'abc\nghi\nfed': 2, 'jkl\nabc\nghi': 1, 'ghi\nfed': 1, 'fed\njkl\nabc': 1, 'ghi\nfed\njkl': 1}
>>>
答案 1 :(得分:1)
所以,像这样(在perl中):
perl -e 'while ( <> ) { push ( @order, $_ ) unless $seen{$_}++; } for (@order) {print if $seen{$_} > 1}' myfile
这可以通过以下方式变成更短的片段:
{{1}}