3

任务是编写一个程序,提示输入文件名,然后生成该文件的索引。前任。索引是按字母顺序排列的索引,显示文档中每个单词出现的行。例如,本段的索引可能显示为:

Word          Line Number
a             1 1 2
alphabetical  1
an            1
appear        2

在这里,我列出了一个列表,以便我可以对单词进行排序。

我有这个代码:

f = open(raw_input("Enter a filename: "), "r")
myDict = {}
linenum = 0

for line in f:
line = line.strip()
line = line.lower()
line = line.split()
linenum += 1

for word in line:
    word = word.strip()
    word = word.lower()
    myDict[word] = linenum

    if word in myDict:
        myDict.sort()
    else:
        myDict.append(word)

print "%-15s %-15s" %("Word", "Line Number")
print "%-15s %-15d" %(myDict.keys(), myDict.values())

当我现在运行程序时,它说'dict'没有属性'sort'。你能解释一下吗?

该文件与示例相同,输出也应该是上面的示例。我是python的新手,请帮助:[

4

3 回答 3

3

我认为使用 dict 是有意义的,但是您必须在添加到 dict 的每个值的同时添加一个键。例如:

>>> dict = {}
>>> dict["apple"] = "red"
>>> dict["banana"] = "yellow"
>>> dict
{'apple': 'red', 'banana': 'yellow'}

在这个例子中,键是“apple”和“banana”,值是“red”和“yellow”。由于这是家庭作业,因此我将由您自己决定适合您的作业的键和值。

此外,这条线是有问题的:

for word in line:

line是一个字符串,因此您实际上是在查看 中的每个字符line,而不是每个单词。您必须找到某种方法来转换line为单词列表...

最后,您的最终语句将只打印最后读取的单词。您正在构建一个字典,但您不是在打印字典,而是在打印单个值。一旦你建立了字典,你应该打印字典本身。


myDict[word] = linenum

if word in myDict:
    myDict.sort()
else:
    myDict.append(word)

您走在正确的道路上,但是对字典进行排序并不是处理多次出现的单词的正确方法(此外, dict 没有排序方法,这就是您收到错误的原因,但即使如果是这样,你就不需要它了)。此外,一旦你为一个键赋值,它就会被添加到字典中,所以它已经被“附加”了。

在您的示例中,单词a出现 3 次,并且输出列出了它出现的每一行,因此您需要一种方法来存储每个单词的行列表。

于 2012-04-05T02:23:35.547 回答
1

你想让 myDict 只是一个列表吗?如果是这样,请将其声明为 myDict = []。列表具有排序和追加功能,但字典没有。

于 2012-04-05T01:46:36.587 回答
1

您可以通过这种方式轻松地对字典的顺序进行排序:

f = open(raw_input("Enter a filename: "), "r")
myDict = {}
linenum = 0

for line in f:
  line = line.strip()
  line = line.lower()
  line = line.split()
  linenum += 1

  for word in line:
    word = word.strip()
    word = word.lower()

    if not word in myDict:
      myDict[word] = [] 

    myDict[word].append(linenum)


print "%-15s %-15s" %("Word", "Line Number")
for key in sorted(myDict):
  print '%-15s: %-15d' % (key, myDict(key))

希望它可以帮助乔迪

于 2012-04-05T18:41:22.537 回答