Python中的反向索引没有返回所需的结果

时间:2013-07-09 17:52:57

标签: python indexing inverse

我在python中为反向索引返回正确的结果时遇到了麻烦。我正在尝试在变量'strlist'中加载一个字符串列表,然后使用我的Inverse索引循环遍历字符串以返回它出现的单词+。以下是我到目前为止所做的事情:

def inverseIndex(strlist):
  d={}
  for x in range(len(strlist)):
    for y in strlist[x].split():
      for index, word in set(enumerate([y])):
        if word in d:
          d=d.update(index)
        else:
          d._setitem_(index,word)
        break
      break
    break
  return d

现在我运行inverseIndex(strlist)

所有返回的都是{0:'This'}我想要的是一个字典,将'strlist'中的所有字词映射到集合d

我最初的做法是错的吗?我在if / else中绊倒了吗?非常感谢任何和所有的帮助。指出我正确的方向。

2 个答案:

答案 0 :(得分:2)

根据您所说的内容,我认为您正在尝试获取以下数据:

input = ["hello world", "foo bar", "red cat"]
data_wanted = {
    "foo" : 1,
    "hello" : 0,
    "cat" : 2,
    "world" : 0,
    "red" : 2
    "bar" : 1
}

所以你应该做的是将单词添加为字典的键,并使它们的值成为它们所在的strlist中子字符串的索引。

def locateWords(strlist):
d = {}
for i, substr in enumerate(strlist):   # gives you the index and the item itself
    for word in substr.split()
        d[word] = i
return d

如果单词出现在strlist中的多个字符串中,则应将代码更改为以下内容:

def locateWords(strlist):
d = {}
for i, substr in enumerate(strlist):
    for word in substr.split()
        if word not in d:
            d[word] = [i]
        else:
            d[word].append(i)
return d

这会将值更改为列表,其中包含strlist中包含该字词的子字符串的索引。

您的一些代码问题已解释

  1. {}不是一个集合,它是一个字典。
  2. break强制循环立即终止 - 您不希望提前结束循环,因为您仍然需要处理数据。
  3. d.update(index)会给你一个TypeError: 'int' object is not iterable。此方法实际上采用可迭代对象并使用它更新字典。通常你会使用一个元组列表:[("foo",1), ("hello",0)]。它只是将数据添加到字典中。
  4. 您通常不想使用d.__setitem__(无论如何都输入了错误)。您只需使用d[key] = value
  5. 您可以使用“for each”样式循环进行迭代,就像上面显示的代码一样。在范围内循环意味着您正在循环索引。 (这不是一个问题,但如果你不小心正确使用索引,它可能会导致额外的错误。)
  6. 看起来你来自另一种编程语言,其中大括号表示集合,并且有一个结束控制块的关键字(如if, fi)。首次启动时很容易混淆语法 - 但如果您在运行代码时遇到问题,请查看您获得的异常并在网上搜索它们!

    P.S。我不确定你为什么想要一套 - 如果有重复,你可能想知道他们所有的位置,而不仅仅是第一个或最后一个或两者之间的任何位置。只需我0.02美元。

答案 1 :(得分:0)

break不是块尾标记;它的意思是“如果你点击这行代码,立即退出循环”。您可能不希望所有这些break语句。

我不确定您认为update方法的作用。

d.update(index)

会尝试将index视为dict或一系列键值对,并将index中的所有映射添加到d。由于index是一个数字,这似乎不是您期望update做的。此外,update返回None,这是相当于不返回任何内容的Python,因此您可能不希望将其值分配给d

我不确定你的期望

for index, word in set(enumerate([y])):

要做。让我们回顾它的作用。 [y]创建一个1元素列表,其唯一元素为y。然后enumerate([y])将返回一个迭代器,产生一个元素,即元组(0, y)。然后set(enumerate([y]))将从该迭代器中获取所有项(所以只有一个项)并创建一个包含这些项的集合。最后,for index, word in set(enumerate([y])):将迭代该单项集,执行带有index == 0word == y的单循环迭代。这可能不是你想要做的。

Python调用__setitem__特殊方法(每边有两个下划线)来实现元素赋值。

d.__setitem__(index, word)

最好写成

d[index] = word

如果您要迭代strlist,则可以直接迭代range(len(strlist)),而不是使用strlist

  for x in range(len(strlist)):
    for y in strlist[x].split():

相当于

  for string in strlist:
    for y in string.split():

因为在strlist上循环会给出strlist的项目。

我希望有所帮助。