Python通过dict循环
我在使用dict创建循环时遇到问题。我有一个字典:键是唯一的数字,值是单词。我需要创建一个矩阵:行是句子的数字,列是单词的唯一数字(来自dict)。矩阵的元素将显示每个句子中每个单词的数量。这是我的创作代码和口述(开始时我有一个包含句子的原始文本文件)Python通过dict循环,python,dictionary,matrix,cycle,Python,Dictionary,Matrix,Cycle,我在使用dict创建循环时遇到问题。我有一个字典:键是唯一的数字,值是单词。我需要创建一个矩阵:行是句子的数字,列是单词的唯一数字(来自dict)。矩阵的元素将显示每个句子中每个单词的数量。这是我的创作代码和口述(开始时我有一个包含句子的原始文本文件) 以open('sensions.txt',r')作为文件\u obj: 行=[] 对于文件_obj中的行: line_split=re.split(“[^a-z]”,line.lower().strip() j=0 新行=[] 虽然j有一些粗心的
以open('sensions.txt',r')作为文件\u obj:
行=[]
对于文件_obj中的行:
line_split=re.split(“[^a-z]”,line.lower().strip()
j=0
新行=[]
虽然j有一些粗心的错误:第7行需要一个右括号,/
不是Python语法
查看您的代码,我不知道您的通用算法是什么,仅用于创建基本字数字典。因此,我建议使用以下更短的代码:
import re
import sys
def get_vocabulary (filename):
vocab_dict = {}
with open (filename, 'r') as file_obj:
for line in file_obj:
for word in re.findall(r'[a-z]+',line.lower()):
if word in vocab_dict: # see below for an interesting alternative
vocab_dict[word] += 1
else:
vocab_dict[word] = 1
return vocab_dict
if len(sys.argv) > 1:
vocab = get_vocabulary (sys.argv[1])
for word in vocab:
print (word, '->', str(vocab[word]))
注意我替换了你自己的
line_split=re.split('[^a-z]',line.lower().strip())
相反
re.findall(r'[a-z]+',line.lower())
因为你的可以返回空元素,而我的不能。最初我必须在将其插入字典之前添加一个测试if word:
,以防止添加大量空元素。通过更好地检查“word”,这就不再需要了
(Python的乐趣:if..else
的替代选项如下所示:
vocab_dict[word] = 1 if word not in vocab_dict else vocab_dict[word]+1
它的效率稍低,因为必须检索两次vocab_dict[word]
,您不能单独说。+1
。不过,这是一条很好的阅读路线。)
将字典转换为“矩阵”(实际上一个简单的数组就足够了)可以使用
听起来你是在逆向设计字典。如果你需要通过查找单词来访问数字,你应该让单词作为键,数字作为值。你能给我们举一个你想要实现的例子吗?当然@Blckknght是对的,但我发现在构建字典时有更多的冗余。为什么要拆分each线,然后再次连接它(?)只是为了循环它的所有内容,当你可以立即添加行split
中的单词时?还有,vocab
不应该是一个全局变量吗?我想创建一个矩阵:行中有句子的数量,列中有单词的数量。我是Python的初学者,我在做我的解决方案是用dict的值做一个数组。非常感谢你的评论!matr=np.array(np.zeros((len(lines),len(vocab)))非常感谢您的回答!这些信息非常有用。我可以解决我的问题,但不是用最好的方法,我只是从dict(val=list(vocab.values())中的值创建了一个数组,通过将+1添加到矩阵元素(如果val[p]==lines[r][h]:matr[r][p]+=1)得到了所需的矩阵
vocab_dict[word] = 1 if word not in vocab_dict else vocab_dict[word]+1
matrix = [[vocab[word], word] for word in sorted(vocab)]
for row in matrix:
print (row)