我有两个 csv 文件,每个文件都包含如下所示的 ngram:
drinks while strutting,4,1.435486010883783160220299732E-8
and since that,6,4.306458032651349480660899195E-8
the state face,3,2.153229016325674740330449597E-8
它是一个三词短语,后跟一个频率数字,然后是一个相对频率数字。
我想编写一个脚本来查找两个 csv 文件中的 ngram,划分它们的相对频率,并将它们打印到新的 csv 文件中。我希望只要三个单词的短语与另一个文件中的三个单词的短语匹配,它就能找到匹配项,然后将第一个 csv 文件中该短语的相对频率除以第二个 csv 文件中同一短语的相对频率。然后我想将短语和两个相对频率的划分打印到一个新的 csv 文件中。
以下是我所了解的。我的脚本正在比较行,但只有当整行(包括频率和相对频率)完全匹配时才能找到匹配项。我意识到这是因为我正在寻找两个完整集合之间的交集,但我不知道如何以不同的方式做到这一点。请原谅我;我是编码新手。你能给我的任何帮助让我更接近一点,这将是一个很大的帮助。
import csv
import io
alist, blist = [], []
with open("ngrams.csv", "rb") as fileA:
reader = csv.reader(fileA, delimiter=',')
for row in reader:
alist.append(row)
with open("ngramstest.csv", "rb") as fileB:
reader = csv.reader(fileB, delimiter=',')
for row in reader:
blist.append(row)
first_set = set(map(tuple, alist))
secnd_set = set(map(tuple, blist))
matches = set(first_set).intersection(secnd_set)
c = csv.writer(open("matchedngrams.csv", "a"))
c.writerow(matches)
print matches
print len(matches)
最佳答案
无需将 res
转储到新文件中(乏味)。这个想法是第一个元素是短语,另外两个元素是频率。使用 dict
而不是 set
一起进行匹配和映射。
import csv
import io
alist, blist = [], []
with open("ngrams.csv", "rb") as fileA:
reader = csv.reader(fileA, delimiter=',')
for row in reader:
alist.append(row)
with open("ngramstest.csv", "rb") as fileB:
reader = csv.reader(fileB, delimiter=',')
for row in reader:
blist.append(row)
f_dict = {e[0]:e[1:] for e in alist}
s_dict = {e[0]:e[1:] for e in blist}
res = {}
for k,v in f_dict.items():
if k in s_dict:
res[k] = float(v[1])/float(s_dict[k][1])
print(res)
关于python - 使用 python 比较两个 csv 文件中的第一列并打印匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27238089/