【问题标题】:Where is this code wrong [closed]这段代码哪里错了[关闭]
【发布时间】:2012-04-17 05:38:51
【问题描述】:
f=open('new.txt')
var=f.read()
var=var.lower()
var = var.replace(';','')
var = var.replace(',','')
var = var.replace('.','')
x=var.split()
dict={}
dictList=[]
dict2={}
for i in xrange(0,len(x)-1):

    if dict.items():
        for k in dict.items():
            if x[i] not in k:

                dict[x[i]]=dict2
                dict2[x[i+1]]=1

            else:
                if dict[x[i]].keys():
                    if x[i+1] in dict[x[i]].keys():
                        dict[x[i]][x[i+1]]+=1
                    else:
                        dict[x[i]][x[i+1]]=1
                else:
                    dict[x[i]][x[i+1]]=1

    else:

        dict[x[i]]=dict2
        dict2[x[i+1]]=1

print dict

此代码必须打印每个单词的二元计数。我很确定我不恰当地实例化了 dict2 。我确定这是一个天真的错误,但我不知何故错过了它。有什么建议? :)

【问题讨论】:

  • "有什么建议吗?"写一个展示问题的最小示例。
  • “打印每个单词的二元计数”是什么意思?您能否提供一个示例 new.txt 以及输出应该是什么?
  • this 代码哪里错了”是一个过于本地化的问题,不太可能帮助任何未来的访问者。
  • 您可能想检查sscce.org
  • Traceback (most recent call last): File "/Users/yanwchan/Documents/test.py", line 14, in <module> for k in dict.items(): RuntimeError: dictionary changed size during iteration 我不太确定 OP 到底想做什么......你能提供一些关于你的问题的信息吗?

标签: python dictionary nlp


【解决方案1】:

如果我必须重构这段代码,我会看:

  • 变量名。像dict 这样的名字不会告诉编码器/维护者。 dictdict2 有什么区别?你今天可能知道,但明天……也许不会
  • 为/if/for/if/if 嵌套。很难遵循所有路径并确保没有可能的错误。我会把它分解成单独的函数,可以独立调试和测试。
  • 数据结构。它们通常是程序的核心。但在这里,它们是什么?这对我来说并不明显,这意味着代码做什么/为什么做任何事情并不明显
  • 错误处理。什么错误是可能的/预期的?哪些会被处理/忽略?

【讨论】:

  • 也不要使用dict,因为它与内置字典类冲突(并覆盖)。
  • 好点。与listint 相同 ...
  • 我要补充一点,for i in xrange(...): 不是处理事物集合的 Python 方式。相反,直接遍历集合,或者如果您确实必须知道正在处理的项目的序列号,请使用enumerate()
  • 我不确定 OP 是否处于 pythonic/unpythonic 级别。
  • 提及它总不会有什么坏处,它旁边可能带有一个星号,表示它是一个高级主题(在教科书中标记为 (*) 的具有挑战性的数学问题的风格。)