【问题标题】:Running a file through a function通过函数运行文件
【发布时间】:2014-01-03 05:33:43
【问题描述】:

我正在尝试从当前文件中创建一个包含多行字谜的新文件。

def Ana(str1, str2):
    str1_list = list(str1)
    str1_list.sort()
    str2_list = list(str2)
    str2_list.sort()
    return (str1_list == str2_list)

newerfile=open("ana.txt","w")
f = open("words.txt")
for word in f:
    s = str(word)
    for word2 in f:
        if word!=word2:
            if Ana(word, word2) is True:
                s += (' ') + str(word2)

if s!=str(word):
    newerfile.write(s)

以上是我当前的代码,但它给我的只是一个空文件。经过一番试验,我相信问题出在最后一行的第四行——“if isAnagram(word, word2) if True:”

该功能不适用于我拥有的文件。我尝试了一个更基本的代码版本来针对一个单词测试整个文件。由于文件中有“was”和“saw”这两个词,我应该得到这些,但没有打印任何内容。

y = 'was'
for line in open('real_words.txt'):
    if isAnagram(line,'was') is True:
        y += (' ') + str(line)
print(y)

当我提供单词列表但不是文件时,该功能工作正常。任何帮助表示赞赏。

如果函数返回true,还有什么方法可以从文件中删除单词和所有字谜?

【问题讨论】:

  • 你指的AnaisAnagram函数吗?顺便说一句,你的第一段代码是if isAnagram() if True,而你的第二段代码是if isAnagram() is True
  • 感谢您指出,Ana 和 isAnagram 是相同的,当我在这里重写代码时,is 和 if 是拼写错误。
  • 我怎样才能得到文件中相同单词的 2 个列表?
  • "for word and word2 in "file":" 会起作用吗?
  • 当你做for word in f时,这是一个迭代器,即内循环第一次迭代后它会被耗尽。如果要测试所有单词组合,请先将它们复制到列表中,或使用itertools.product

标签: python file function anagram


【解决方案1】:

最好的数据结构是列表的字典,其中每个字符串的排序版本是键。共享该排序版本的每个单词都将进入列表。生成之后,只有一个单词的键进入没有字谜的单词文件,而有多个单词的键进入字谜文件。

from collections import defaultdict
words_by_sorted = defaultdict(list)
f = open("words.txt")
for line in f:
    word = line.strip() # remove the newline
    sorted_key = tuple(sorted(word))
    words_by_sorted[sorted_key].append(word)
f.close()
unanagrammed = open("unanagrammed.txt", "w")
anagrammed = open("anagrammed.txt", "w")
for words in words_by_sorted.itervalues():
    if len(words) == 1:
        unanagrammed.write(words[0] + '\n')
    else:
        anagrammed.write(' '.join(words) + '\n')
unanagrammed.close()
anagrammed.close()

这不会维护两个文件中的顺序。如果你需要这样做,你可以按照你第一次看到它们的顺序维护一个排序键的列表,或者使用有序的字典(并根据需要显式创建列表,而不是使用defaultdict)如果你在2.7.

它还创建了两个文件——你不能真正“从旧文件中删除它们”,但如果你愿意,你可以覆盖它。这种方法可以让您在删除输入之前更仔细地检查您的输出。

使用with 语句打开文件也是一个好习惯,但您的基本代码使用原始open,所以我坚持这样做。

【讨论】:

  • 这实际上比我的解决方案更好(而且更快)。 +1
【解决方案2】:

(假设words.txt 是一个每行一个单词的文件,并且您试图找到这些单词的所有变位词对并将它们打印到第二个文件,每行一对。)

您的代码似乎有两个问题:

  1. 当您执行for word in f 时,您使用的是迭代器,而for word2 in f 您使用相同的 迭代器,即,该迭代器将在循环的第一次迭代后耗尽!李>
  2. 您似乎只在循环完成后才写入文件,但s 将始终只保存最后一对单词,因此您只需将那对写入文件。 (可能只是缩进的问题。)

要获得两个单词的所有组合,最好使用itertools.combinations,有点像这样(未经测试,一种伪代码):

words = infile.read().splitlines()
for w1, w2 in itertools.combinations(words, 2):
     if isAnagram(w1, w2):
          outfile.write("%s %s" % (w1, w2))

但是,这将在每行只写一个 pair 字谜。如果您想将整个 groups 写入一行,我想您将需要两个循环,就像在您的代码中一样。请记住不要对两个循环使用相同的迭代器,例如先将 filt 的内容放入一个列表中,然后将该列表用于循环。

您也可以为此使用列表推导:

words = infile.read().splitlines()
for w1 in words:
    outfile.write(" ".join(w2 for w2 in words if isAnagram(w1, w2)))

(请注意,这仍然不是完美的,因为行会重复,组中的每个单词都会重复一次。但我相信你可以自己弄清楚其余的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多