无法访问 Python 列表中的元素

Cannot access elements in a list in Python

我使用双字母组和单字母组。

我的二元组是元组的计数器,我的一元组是一个列表,其中

 uni['some key']=count

我正在尝试执行以下操作

 for b,countB in bigrams.most_common()
      key=b[0] # this is guaranteed to be a key for my unigrams
      uniCount=uni[key]

出现以下错误:

 TypeError: tuple indeces must be integers or slices, not str

我很困惑。为什么这是个问题? uni 本质上是一个散列,它的键值是字符串。我怎样才能访问 u[key]?

编辑:完整代码

 # corpus is a string containing my corpus
 sp=corpus.split()

 uni={}
 for t in sp:
      try:
           uni[t]+=1
      except:
           uni[t]=0
 prev=''
 big=[]
 for t in sp:
      tup=(prev,t)
      big.append(tup)
      prev=t

 bigrams=collections.Counter(big)

 for b,countB in bigrams.most_common():
      key=b[0]
      uniCount=uni[key]

当您可能需要字典时使用元组是错误的。作为错误消息状态,元组不能由字符串键索引 - 您应该使用数字索引。

听写可以让您随心所欲地使用字符串键。

d = {}
d['some key] = 23

更新后的代码让您更清楚自己在做什么。您首先在 uni 中创建字数统计字典。我认为读取

的行
uni[t] = 0

实际上应该阅读

uni[t] = 1

因为当执行该分支时,您正在检测单词的第一次出现。接下来,您在 big 中创建一个二元组列表,然后计算这些二元组。

我对最后的 for 循环有点迷茫,不过,其中 b 将是 Counter 项的键,而 countB 是计数.所以 key 将是二元组的第一个词,而 uniCount 将是该词在语料库中出现的次数。确定了这些值后,您就可以继续对它们执行任何操作,然后转到下一个最常见的二元语法。

也许是时候在最后一个循环中打印一些东西了?以其他方式发布的代码看起来很合理。

我已经用 corpus = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore" 执行了你的代码,因为你说这个错误与 uni 是一个元组有关,但它实际上是一个字典。

我得到的错误是不同的,它是 uniCount=uni[key] 上的 KeyError 因为你正在创建一个元组列表 (previous word, word)corpus 的第一个单词有前一个单词设置为空字符串(prev='' 是初始状态)。

uniCount=uni[key] 行的键等于元组的第一项 (key=b[0]),因此 uni 字典中没有键 ''它正在抛出 KeyError.

您可能希望获取单词而不是元组的前一个单词作为 uni 中使用的键。

我尝试了你的代码并得到了一个 KeyError: '' ,这是因为你的初始二元组在位置 0 处有一个空字符串并且 '' 不在你的一元组字典中。我没有看到 TypeError,所以它可能来自您代码中的其他地方。

就是说,其他各种评论:

  1. 您似乎了解 collections.Counter 的作用,但您在构建 uni 时随意尝试自己做——您可以替换您的第一段代码与:

    unigrams = Counter(sp)

  2. 您可以使用 zip 迭代对并以这种方式构造您的双字母组,而不是 DIY 循环它,这也消除了您的 '' 问题:

    bigrams = Counter(zip(sp, sp[1:]))

因此您的代码变为:

sp = corpus.split()
unigrams = Counter(sp)
bigrams = Counter(zip(sp, sp[1:]))

for bigram, count in bigrams.most_common():
    # etc.