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

Python中的反向索引未返回所需结果,python,indexing,inverse,Python,Indexing,Inverse,在python中,我很难为反向索引返回正确的结果。我试图在变量'strlist'中加载一个字符串列表,然后使用反向索引在字符串上循环,以返回单词+所在的位置。以下是我到目前为止所做的: def inverseIndex(strlist): d={} for x in range(len(strlist)): for y in strlist[x].split(): for index, word in set(enumerate([y])): if w

在python中,我很难为反向索引返回正确的结果。我试图在变量'strlist'中加载一个字符串列表,然后使用反向索引在字符串上循环,以返回单词+所在的位置。以下是我到目前为止所做的:

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中绊倒了吗?非常感谢您的任何帮助。将我指向正确的方向。

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

我不确定你认为
update
方法有什么作用

d.update(index)
将尝试将
index
视为
dict
或键值对序列,并将
index
中的所有映射添加到
d
。由于
索引
是一个数字,因此这似乎不是您所期望的
更新
所要做的。另外,
update
返回
None
,这是Python中不返回任何内容的等价物,因此您可能不想将其值赋给
d

我不知道你期望什么

for index, word in set(enumerate([y])):
去做。让我们看一下它的作用
[y]
创建一个单元素列表,其唯一元素是
y
<代码>枚举([y])然后将返回一个迭代器,生成一个元素,即元组
(0,y)
set(enumerate([y])
然后将从该迭代器中获取所有项(因此只有一项),并创建一个包含这些项的集合。最后,
对于索引,集合中的word(枚举([y]):
将在该项集合上迭代,执行单个循环迭代,其中
index==0
word==y
。这可能不是你想做的

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

d.__setitem__(index, word)
最好写为

d[index] = word
如果要迭代
strlist
,则可以直接迭代
strlist
,而不是使用
range(len(strlist))

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

  for string in strlist:
    for y in string.split():
因为在strlist上循环会得到strlist的项目


我希望这会有所帮助。

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

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
中包含该单词的子字符串的索引

解释了代码的一些问题
  • {}
    不是集合,而是字典
  • break
    强制循环立即终止-您不想提前结束循环,因为您还有数据要处理
  • d.update(index)
    将给您一个
    TypeError:“int”对象不可编辑
    。这个方法实际上获取一个iterable对象并用它更新字典。通常情况下,您会为此使用元组列表:
    [(“foo”,1),(“hello”,0)]
    。它只是将数据添加到字典中
  • 您通常不想使用
    d.\uuuu setitem\uuuuuuu
    (无论如何,您键入的是错误的)。您只需使用
    d[key]=value
  • 您可以使用“for-each”样式的循环进行迭代,如上面的代码所示。在范围上循环意味着在索引上循环。(这不完全是个问题,但如果不小心正确使用索引,可能会导致额外的bug)
  • 看起来您来自另一种编程语言,其中大括号表示集合,还有一个结束控制块的关键字(如
    if,fi
    )。当您第一次启动时,很容易混淆语法-但是如果您在运行代码时遇到问题,请查看您得到的异常并在web上搜索它们


    另外,我不知道你为什么想要一套——如果有重复的,你可能想知道它们的所有位置,而不仅仅是第一个或最后一个或介于两者之间的任何东西。仅我的$0.02。

    此处正确显示了
    中断的缩进级别吗?为什么在第一次迭代后
    中断
    所有循环?什么是
    d.\u setitem\u
    ?如果显示一些示例输入和所需输出,可能会有所帮助。我不知道你在努力实现什么。请忽略那些反对票——你显然已经尽了最大努力。否决票是给那些不希望我们为他们做家庭作业/工作的人的。哇,非常感谢你的否决。最后你们猜对了,我也在试着找到复制品的位置。我一路上迷路了,只是想从代码中得到一些结果来帮助我找到正确的方向。我正在阅读你给出的代码,非常清楚,谢谢你的帮助。谢谢你的帮助,并解释了我的许多错误。有了这个故障,看看我哪里出了问题,如何做得更好,这是很有帮助的。