繁体   English   中英

如何使用python具有相同的列和行标题?

[英]How to have same column and row headings using python?

我想从文本文件中读取行,并基于单词之间的Wu-Palmer距离构建距离矩阵。 例如:

           House    Grass   Boat   Cat
House       x        y       ..    ..
Grass       x1       y1      ..    ..
Boat        x2       y2      ..    ..
Cat         x3       y3      ..    ..

我想知道是否可以在python中使用任何现有功能来从文本文件中读取行并将行输出为距离矩阵的行和列?

如果您的输入只是用空格分隔的单词,则可以像下面这样轻松地遍历它们:

words = set()
with open("input.txt", "r") as fd:
    for line in fd:
        words.update(line.split())

set的使用可确保每个单词仅记录一次-听起来就是您所追求的。

如果您的输入使用的是英文文本,则事情会变得有些困难,因为您想抓住“我愿意”之类的东西-您还应决定是否将连字符的单词(例如“兼职”)归为一个单词-我的示例可以,但是很容易更改。 尽管我不喜欢它们,但在这里正则表达式实际上非常有用:

import re
import string

non_word_re = re.compile(r"[^-\w']+")
words = set()
with open("input.txt", "r") as fd:
    for line in fd:
        words.update(i for i in non_word_re.split(line) if i[0] in string.letters)

这将创建一set单词,其中一组字符是由集合[a-zA-Z0-9_-']的一个或多个组成的任何字符,并且第一个字符是字母。

之后,您可以轻松计算出每对单词之间的距离:

all_distances = {}
for word in words:
    all_distances[word] = dict((i, calculate_distance(word, i)) for i in words)

这里的数据结构可能比嵌套的字典更整洁,但是我认为足够简单了。

最后,您可以输出制表符分隔的矩阵,如下所示:

with open("output.txt", "w") as fd:
    fd.write("\t" + "\t".join(sorted(all_distances.keys())) + "\n")
    for word1, distances in sorted(all_distances.iteritems()):
        fd.write(word1 + "\t" + "\t".join(i[1] for i in sorted(distances.iteritems())))

如果yuo想要更接近于漂亮格式的输出矩阵(即,根据其内容自动调整每一列的大小)的东西,那么这本身并不 ,但是有点儿麻烦,需要更多代码。

顺便说一句,如果您想读取或写入CSV格式的文件,然后看看Python csv模块,它会处理一些繁琐的事情,例如为您报价。

那是你所追求的吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM