首页 > 解决方案 > 从 txt 文件中返回每行常见和唯一的单词?

问题描述

我刚刚开始使用 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查找常用词之类的方法还是更好的解决方案?

标签: pythonpandasjupyter-notebookjupyter

解决方案


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


你想要的是基本的集合操作,而 Pythonset对象非常适合。如果evens是出现在偶数行中odds的所有单词的集合,并且是出现在奇数行中的所有单词的集合,则:

  • evens & odds(intersection) 是出现在偶数行和赔率行中的所有单词的集合。
  • evens - odds(设置差异)是出现在偶数行但不是奇数行的所有单词。
  • odds - evens反过来也是一样的。

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

您的代码几乎可以按原样运行,但您不能只是这样做for i in rows- 将每个代码i变成一行,而不是索引,因此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)

所以剩下的唯一事情就是把所有这些部分放在一起,并决定你想如何在最后输出排序的列表(只是print会工作,但你可能想要看起来比列表显示更好的东西),你就完成了.


推荐阅读