2016-01-20 70 views
1

我所经历的彼得·诺维格的数独解算器代码(http://norvig.com/sudopy.shtml)和跨越这条线进来:在Python中,为什么这行从文件运行(没有例外),但在shell中运行时抛出异常?

peers = dict((s, set(sum(units[s],[]))-set([s])) 
     for s in squares) 

如果我了复制代码及包括本线(即高达28行),并从运行一个文件,它运行良好,并且字典'peers'具有例外值。但是,如果我运行此文件之后,我尝试运行从shell这条线,我得到一个错误:

peers = dict((s, set(sum(units[s],[]))-set([s])) 
      for s in squares) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-33-2652de1ecd8a> in <module>() 
     1 peers = dict((s, set(sum(units[s],[]))-set([s])) 
----> 2    for s in squares) 

<ipython-input-33-2652de1ecd8a> in <genexpr>((s,)) 
     1 peers = dict((s, set(sum(units[s],[]))-set([s])) 
----> 2    for s in squares) 

C:\PyCanopy\User\lib\site-packages\numpy\core\fromnumeric.pyc in sum(a, axis, dtype, out, keepdims) 
    1717   except AttributeError: 
    1718    return _methods._sum(a, axis=axis, dtype=dtype, 
-> 1719         out=out, keepdims=keepdims) 
    1720   # NOTE: Dropping the keepdims parameters here... 
    1721   return sum(axis=axis, dtype=dtype, out=out) 

C:\PyCanopy\User\lib\site-packages\numpy\core\_methods.pyc in _sum(a, axis, dtype, out, keepdims) 
    30 
    31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False): 
---> 32  return umr_sum(a, axis, dtype, out, keepdims) 
    33 
    34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False): 

TypeError: cannot perform reduce with flexible type 

我一直没能制定出这是为什么。我发现这行代码很奇怪,因为它的sum的值超过dict的值加上空的[]。任何指导?谢谢。

+0

,我不能与你的主要问题有帮助,但第二ARG Python的内置'sum'功能是初始值,默认情况下是零。通过提供'[]'作为起始参数,它可以让您将列表列表展平为一个列表。例如,sum([[1],[2],[3]],[])'评估为'[1,2,3]'。 –

回答

3

中的代码python解释和ipython对我的作品都。 看起来运行你这样做的代码之前:

from numpy import sum 

所以现在sum不是Python的标准sum,但它是从numpy进口不同的功能。 这就是代码产生错误的原因。

解决方案:ipython壳只是退出,再次运行它,并把代码粘贴到其中。

编辑:关于与空列表的总和,这只是使单位平坦的一个技巧。 例如,单位[ 'I1']是这样的:

[['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'], 
['I1', 'I2', 'I3', 'I4', 'I5', 'I6', 'I7', 'I8', 'I9'], 
['G1', 'G2', 'G3', 'H1', 'H2', 'H3', 'I1', 'I2', 'I3']] 

而且sum(units['I1'], [])看起来是这样的:

['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'I1', 'I2', 'I3', 'I4', 'I5', 'I6', 'I7', 'I8', 'I9', 'G1', 'G2', 'G3', 'H1', 'H2', 'H3', 'I1', 'I2', 'I3'] 

引擎盖下的总和就什么是这样的:

list = [] 
for elem in units['I1']: 
    list = list + elem 
+0

呵呵。那怎么样...我可以看到这可能是这样,虽然我现在正在努力测试它。我似乎无法弄清楚为什么Canopy的解释器自动加载numpy,也不知道如何关闭它。谢谢! – nevakanezzar

+0

@nevakanezzar不客气。我还更新了答案,并解释了什么总和(单位[s],[])的作用。 –

相关问题