从txt文件中每行返回常用词和唯一词?

时间:2018-08-10 23:33:59

标签: python pandas jupyter-notebook jupyter

我刚开始使用Jupyter笔记本,并且得到了一个应该写的任务:

将Python脚本编写为    查找并按排序顺序输出唯一单词:

  1. 同时存在于偶数行和奇数行。
  2. 仅在偶数行上
  3. 仅在奇数行上

所有标点符号和大写字母均已删除,因此我们不必为此担心。

输出应如下所示

Common words on both lines:
        ['I', 'the', 'am', 'all', 'as', ...]

         Only even lines :
        ['yellow', 'christmas', 'smell', ...]

        Only odd lines:
        ['yours', 'war', 'may', 'remote', ...]

我从导入文件开始

Import pandas as pd
textfile = pd.read_fwf('textfile.txt')

首先,我假设我应该为每一行获取某种列表。 然后我认为我应该用

分隔偶数行和奇数行
for i in rows:
    if i % 2 == 0: --even row
             else --odd row

我还希望使用len函数来查找唯一的单词。是否可以使用not len之类的东西来查找常用词,还是更好的解决方案?

1 个答案:

答案 0 :(得分:0)

您当然可以使用Pandas(或NumPy)方法来执行此操作,但是,与许多其他操作不同,对于此操作,似乎没有它会更简单。


您需要的是基本的集合操作,而Python set对象则是完美的选择。如果evens是所有出现在偶数行中的单词的集合,而odds是所有出现在奇数行中的单词的集合,则:

  • evens & odds(交叉点)是同时出现在偶数和奇数行中的所有单词的集合。
  • evens - odds(设置差异)是所有出现在偶数行而不是奇数行的单词。
  • odds - evens相反。

那么,您如何构建这些集合?只是循环遍历文件,而不是将文件导入Pandas并遍历行。

您的代码几乎可以按原样工作,但是您不能仅执行for i in rows,这会使每个i成为,而不是索引,因此{{ 1}}是没有意义的。您想使用i % 2,以便同时获得一行和一个索引:

enumerate

我在这里假设您的文件每行一个字。如果需要将行拆分为单独的单词,只需使用evens, odds = set(), set() with open('textfile.txt') as f: for index, row in enumerate(f): if index % 2 == 0: evens.add(row.strip()) else: odds.add(row.strip())

split

现在,剩下的唯一部分是“按排序顺序”。您只需将集合传递到 if i % 2 == 0: evens.update(row.split()) else: odds.update(row.split()) 即可处理:

sorted

因此,剩下的唯一内容就是所有这些片段,并决定如何在最后输出排序后的列表(只是common = sorted(evens & odds) 可以工作,但是您可能想要看起来比列表更好的东西)显示),就完成了。