ValueError:在可迭代列表中不能将负数提升到分数幂 - Python

时间:2015-07-31 07:53:40

标签: python arrays negative-number

我们列出了10点坐标。 x和y如下:

注意:这里我们不使用numpy.array迭代x,y和br的列表,因为在不久的将来,我会将它复制到Fortran77中。

x = [7., -6., 7., -7., 8., 9., 5., 4., -5., 0.]
for i, x[i] in enumerate(x):
  print 'The values of x =', x[i]


y = [3., 6., 3., 9., 1., 9., -2., 0., 3., 7.]
for i, y[i] in enumerate(y):
  print 'The values of y =', y[i]


br  = [1., 2., 8., 0., 7., 9., 6., 9., 7., 4.]
for i, br[i] in enumerate(br):
   print 'brightness = ',br[i]

注意:rad_cut是圆的半径(r ^ 2 = x ^ 2 + y ^ 2) rad_cut = input(“请提供rad_cut的值:”)

 br_total = 0
 for i in xrange(0,10):
    if x[i]**0.5 + y[i]**0.5 < rad_cut:
       br_total += br[i]

 print 'The total brightness = ', br_total

我遇到的问题如下:

 in <module>
    if x[i]**0.5 + y[i]**0.5 < rad_cut:
ValueError: negative number cannot be raised to a fractional power

如果有人能帮我解决这个问题,我将不胜感激。我试图使用复数,因为可迭代列表中的负数x[i+0j]**0.5 + y[i+0j]**0.5 < rad_cut: 但它不起作用。

1 个答案:

答案 0 :(得分:3)

如评论中所述,您需要将这些x&amp; y值,而不是取其平方根。

这是编写程序的更多Pythonic方法。此代码适用于Python 2.6及更高版本,它也可以在Python 3上正常运行。

主要更改是它使用sum()函数中的generator expression来添加相应的br值。

#!/usr/bin/env python
from __future__ import print_function

x = [7., -6., 7., -7., 8., 9., 5., 4., -5., 0.]
y = [3., 6., 3., 9., 1., 9., -2., 0., 3., 7.]
br = [1., 2., 8., 0., 7., 9., 6., 9., 7., 4.]

print('      x    y   br')
for i, (xi, yi, bri) in enumerate(zip(x, y, br)):
    print('{0}: {1:4.1f} {2:4.1f} {3:4.1f}'.format(i, xi, yi, bri))

rad_cut = input("Please provide a value of rad_cut: ")
rad_cut = float(rad_cut)

rad_sq = rad_cut ** 2

br_total = sum(bri for xi, yi, bri in zip(x, y, br) 
    if xi**2 + yi**2 < rad_sq)

print('The total brightness = {0:.1f}'.format(br_total))

典型输出

      x    y   br
0:  7.0  3.0  1.0
1: -6.0  6.0  2.0
2:  7.0  3.0  8.0
3: -7.0  9.0  0.0
4:  8.0  1.0  7.0
5:  9.0  9.0  9.0
6:  5.0 -2.0  6.0
7:  4.0  0.0  9.0
8: -5.0  3.0  7.0
9:  0.0  7.0  4.0
Please provide a value of rad_cut: 10
The total brightness = 44.0

注意:在Python 2中使用raw_input()而不是input()会更好,因为input()的Python 2版本在输入的数据上使用了潜在的dangerous eval() function; {3}的Python 3版本与Python 2的input()相同。