无法在Python中访问列表中的元素

无法在Python中访问列表中的元素,python,nlp,tuples,n-gram,Python,Nlp,Tuples,N Gram,我和比格拉姆和单格拉姆一起工作 我的bigram是一个元组计数器,我的unigram是一个列表,其中 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 mu

我和比格拉姆和单格拉姆一起工作

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

 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[键]

编辑:完整代码

 # 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]

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

dict将允许您按照自己的意愿使用字符串键

d = {}
d['some key] = 23
更新后的代码可以更好地了解您正在做什么。首先,在uni中创建一个单词计数的dict。我想这句话的意思是

uni[t] = 0
实际上应该读

uni[t] = 1
因为当执行该分支时,您正在检测单词的第一次出现。接下来,创建一个big中的bigram元组列表,然后对这些bigram进行计数

不过,我对最终的for循环有点迷茫,其中b是计数器项的键,countB是计数。所以关键字将是二元结构的第一个单词,uniCount将是该单词在语料库中出现的次数。在建立了这些值之后,您可以继续对它们不做任何处理,并继续使用下一个最常见的二元图


也许是时候在最后的循环中进行一些打印了?否则,发布的代码看起来是合理的。

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

dict将允许您按照自己的意愿使用字符串键

d = {}
d['some key] = 23
更新后的代码可以更好地了解您正在做什么。首先,在uni中创建一个单词计数的dict。我想这句话的意思是

uni[t] = 0
实际上应该读

uni[t] = 1
因为当执行该分支时,您正在检测单词的第一次出现。接下来,创建一个big中的bigram元组列表,然后对这些bigram进行计数

不过,我对最终的for循环有点迷茫,其中b是计数器项的键,countB是计数。所以关键字将是二元结构的第一个单词,uniCount将是该单词在语料库中出现的次数。在建立了这些值之后,您可以继续对它们不做任何处理,并继续使用下一个最常见的二元图


也许是时候在最后的循环中进行一些打印了?否则,发布的代码看起来是合理的。

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

我得到的错误是不同的,它是uniCount=uni[key]上的一个键错误,因为您正在创建一个元组列表previous word,word,并且语料库的第一个单词将previous word设置为空字符串prev=是初始状态

uniCount=uni[key]行中的键等于元组键=b[0]的第一项,因此,由于uni字典中没有键,因此抛出了一个KeyError


你可能想让元组中的单词而不是前一个单词成为uni中使用的键。

我已经用corpus=Lorem ipsum dolor sit amet,concetetur adipising elit,sed do eiusmod temporal incidiut ut labore执行了你的代码,因为你说这个错误与uni是元组有关,但实际上它是一本词典

我得到的错误是不同的,它是uniCount=uni[key]上的一个键错误,因为您正在创建一个元组列表previous word,word,并且语料库的第一个单词将previous word设置为空字符串prev=是初始状态

uniCount=uni[key]行中的键等于元组键=b[0]的第一项,因此,由于uni字典中没有键,因此抛出了一个KeyError


您可能希望将元组中的单词(而不是上一个单词)作为uni中使用的键。

我尝试了您的代码,但出现了一个KeyError:这是因为您的初始bigram在位置0处有一个空字符串,并且不在UNIGRAM字典中。我没有看到TypeError,因此它可能来自代码中的其他地方

尽管如此,各种其他评论:

您似乎理解collections.Counter的功能,但在构建uni时您只是随意地尝试自己完成—您可以用以下代码替换第一段代码:

单格=计数器

您可以使用来迭代配对,并以这种方式构建双元图,而不是DIY循环,这也可以解决您的问题:

bigrams=Counterzipsp,sp[1:]

因此,您的代码变成:

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

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

我尝试了您的代码并得到了一个keyrerror:这是因为您的初始bigram在位置0处有一个空字符串,并且不在您的unigrams字典中。我没有看到打字错误,所以可能是来自y的其他地方 我们的代码

尽管如此,各种其他评论:

您似乎理解collections.Counter的功能,但在构建uni时您只是随意地尝试自己完成—您可以用以下代码替换第一段代码:

单格=计数器

您可以使用来迭代配对,并以这种方式构建双元图,而不是DIY循环,这也可以解决您的问题:

bigrams=Counterzipsp,sp[1:]

因此,您的代码变成:

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

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

在key=b[0]之后打印{}.formatkey会得到什么?需要更多的代码;根据错误,当您声称uni是dict时,它看起来像是一个元组。事实上,语句my unigrams是一个列表与示例uni['some key']=count冲突。列表也不能以这种方式编制索引。@Samundra当我添加它时,打印的内容与我添加时相同printkey@tzaman添加了更多代码在key=b[0]之后打印{}.formatkey时会得到什么?需要更多代码;根据错误,当您声称uni是dict时,它看起来像是一个元组。事实上,语句my unigrams是一个列表与示例uni['some key']=count冲突。列表也不能以这种方式编制索引。@Samundra当我添加它时,打印的内容与我添加时相同printkey@tzaman添加了更多代码我不确定我的术语是否正确。我犯了一个错误,试图用一种我不太熟悉的语言来解决问题。我在上面添加了更多代码。通过对扩展代码进行更全面的分析进行了更新。另外,请注意,正如其他答案中提到的,您的第一个二元图当前将空字符串作为其第一个元素,如果它是最常见的二元图之一,则可能会导致问题。。。可能是在一个简短的语料库中。我不确定我的术语是否正确。我犯了一个错误,试图用一种我不太熟悉的语言来解决问题。我在上面添加了更多代码。通过对扩展代码进行更全面的分析进行了更新。另外,请注意,正如其他答案中提到的,您的第一个二元图当前将空字符串作为其第一个元素,如果它是最常见的二元图之一,则可能会导致问题。。。因为它可能在一个简短的语料库中。@basil zip迭代多个序列并生成对。sp[1:]是同一列表的第二个元素。因此,Zipp,sp[1:]生成所有的二元元组,而不是在第二个循环中手动构造big。我在主帖中为zip添加了一个文档链接。@basil zip迭代多个序列并生成对。sp[1:]是同一列表的第二个元素。因此,Zipp,sp[1:]生成所有的二元元组,而不是在第二个循环中手动构造big。我在主帖子中添加了一个zip文档链接。