在CSV文件中查找多次配对

Adj*_*con 3 python csv list python-2.7 find-occurrences

我正在尝试编写一个Python脚本,该脚本将搜索CSV文件并确定当两个项目彼此相邻出现时的出现次数。

例如,假设CSV如下所示:

red,green,blue,red,yellow,green,yellow,red,green,purple,blue,yellow,red,blue,blue,green,purple,red,blue,blue,red,green 
Run Code Online (Sandbox Code Playgroud)

而且我想查找“红色,绿色”彼此相邻出现的次数(但我想要一个不仅仅针对此CSV单词的解决方案)。

到目前为止,我认为可能将CSV转换为列表可能是一个不错的开始:

import csv
with open('examplefile.csv', 'rb') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print your_list
Run Code Online (Sandbox Code Playgroud)

哪个返回:

[['red', 'green', 'blue', 'red', 'yellow', 'green', 'yellow', 'red', 'green', 'purple', 'blue', 'yellow', 'red', 'blue', 'blue', 'green', 'purple', 'red', 'blue', 'blue', 'red', 'green ']]
Run Code Online (Sandbox Code Playgroud)

在此列表中,出现了三种情况'red', 'green'-什么是一种方法/模块/循环结构,我可以用来找出列表中两个项目在列表中彼此相邻的次数是否超过一次?

DG1*_*DG1 5

您在寻找什么被称为双字(两个单词对)。您通常会在文本挖掘/ NLP类型问题中看到这些问题。尝试这个:

from itertools import islice, izip
from collections import Counter
print Counter(izip(your_list, islice(your_list, 1, None)))
Run Code Online (Sandbox Code Playgroud)

返回:

计数器({('红色','绿色'):3,('红色','蓝色'):2,((黄色),'红色'):2,2,('绿色','紫色'):2 ,('blue','blue'):2,('blue','red'):2,('purple','blue'):1,('red','yellow'):1,( '绿色','蓝色'):1,('紫色','红色'):1,('蓝色','黄色'):1,('蓝色','绿色'):1,('黄色','green'):1,(('green','yellow'):1})

如果您只需要获取出现次数超过1的项目,则将Counter对象视为python dict。

counts = Counter(izip(your_list, islice(your_list, 1, None)))
print [k for k,v in counts.iteritems() if v  > 1]
Run Code Online (Sandbox Code Playgroud)

因此,您只有相关的对:

[('红色','蓝色'),('红色','绿色'),('黄色','红色'),('绿色','紫色'),('蓝色','蓝色') , ('蓝红')]

请参阅我从那里借来一些代码的文章:使用python计算文件中的双字(两个单词对)

  • @ gillbates,islice遍历列表,从元素1开始直到结尾。izip从元素0开始使用切片对列表进行压缩,从而将相邻单词分组在一起。然后,Counter遍历压缩后的对并计数出现次数。如果尚不清楚,请在python中查找切片和压缩,然后查看itertools如何将列表上的这些操作转换为迭代器。 (2认同)