无法访问 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
,所以它可能来自您代码中的其他地方。
就是说,其他各种评论:
您似乎了解 collections.Counter
的作用,但您在构建 uni
时随意尝试自己做——您可以替换您的第一段代码与:
unigrams = Counter(sp)
您可以使用 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.
我使用双字母组和单字母组。
我的二元组是元组的计数器,我的一元组是一个列表,其中
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
,所以它可能来自您代码中的其他地方。
就是说,其他各种评论:
您似乎了解
collections.Counter
的作用,但您在构建uni
时随意尝试自己做——您可以替换您的第一段代码与:unigrams = Counter(sp)
您可以使用
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.