Python通过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有一些粗心的

我在使用dict创建循环时遇到问题。我有一个字典:键是唯一的数字,值是单词。我需要创建一个矩阵:行是句子的数字,列是单词的唯一数字(来自dict)。矩阵的元素将显示每个句子中每个单词的数量。这是我的创作代码和口述(开始时我有一个包含句子的原始文本文件)

以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)