【问题标题】:TypeError: only length-1 arrays can be converted to Python scalars?TypeError:只有长度为 1 的数组可以转换为 Python 标量?
【发布时间】:2014-09-27 14:06:41
【问题描述】:

这是我在程序中使用的例程(见下文),但我不断收到相同的错误。我该怎么做才能解决它?

def multiplos(n):
    from numpy import unique

    list=[]
    list1=[]
    list2=[]

    for i in xrange(1,n+1):
            s=17*i
            if s%10==0 and s%2==0 and s%3==0 and s%8==0 and s%19==0 and s%11==0 and s%13==0 and s%17==0:
                    list=list+[s]

    for i in xrange(1,n+1):
            m=13*i
            if m%10==0 and m%2==0 and m%3==0 and m%8==0 and m%19==0 and m%11==0 and m%13==0 and m%17==0:
                    list1=list1+[m]

    for i in xrange(1,n+1):
            t=7*i
            if t%10==0 and t%2==0 and t%3==0 and t%8==0 and t%19==0 and t%11==0 and t%17==0 and t%13==0:
                    list2=list2+[t]

    #Concatenando las tres listas
    lista_final=list+list1+list2
    #Lista sin repeticiones
    final=unique(lista_final)
    return final

程序:

n=20000

from multiplos_7_13_17 import multiplos
mult=multiplos(n)

for i in xrange(mult):
     if mult[i]%4==0 and mult[i]%6==0 and mult[i]%9==0 mult[i]%12==0 mult[i]%14==0 and mult[i]%15==0 and mult[i]%16==0 and mult[i]%17==0 and$
             print "¡Lo has encontrado!",mult[i]
     else:
             print "Este no es...D:"

错误TypeError: only length-1 arrays can be converted to Python scalars 打印在for i in xrange(mult):

【问题讨论】:

  • 你要么想要for num in mult: 要么想要for i in xrange(len(mult)): 可能是前者。
  • 我更改了程序,我想评估列表中的每个术语(mult),看看哪个满足条件
  • if 语句末尾的 and$ 应该是什么?
  • 表示要显示“print !Lo has encontrado!”,mult[i]...mult[i]需要满足print上一行的所有语句
  • and$ 绝对不是有效的 Python。您还缺少 if 语句中谓词之间的几个 and 语句(mult[i]%9==0 mult[i]%12==0 mult[i]%14==0 不是有效的 Python,您需要在每个谓词之间使用 and)。

标签: python typeerror


【解决方案1】:

而不是尝试这样做:

for i in xrange(mult):
     if mult[i]%4==0 and mult[i]%6==0 and mult[i]%9==0 mult[i]%12==0 mult[i]%14==0 and mult[i]%15==0 and mult[i]%16==0 and mult[i]%17==0 and$
             print "¡Lo has encontrado!",mult[i]
     else:
             print "Este no es...D:"

这样做:

for num in mult:
     if all(num % val == 0 for val in [4, 6, 9, 12, 14, 15, 16, 17]):
         print "¡Lo has encontrado!",num
     else:
         print "Este no es...D:"

您的原始代码已损坏,因为您试图将一个 numpy 数组传递给 xrange,但 xrange 只接受 int 值。您可能打算做的是for i in xrange(len(mult)),但这不是在这里迭代的最佳方式,因为您实际上并不需要数组的索引。您真正关心的是数组中的每个值,因此使用for num in mult 是更好的选择(并且需要更少的输入,这很好)。

此外,我利用您重复进行相同比较的事实缩短了您的 if 语句。我没有一遍又一遍地重新输入num % some_number == 0,而是使用all 和一个生成器表达式来迭代[4, 6, 9, 12, 14, 15, 16, 17],并且只在num % val == 0True 时才返回True

编辑:

这是一个完整的工作示例,带有输出。我还简化并加速了 multiplos 函数,尽管它在功能上仍与您的原始函数相同。

def multiplos(n):
    from numpy import unique

    list=[]
    list1=[]
    list2=[]

    mod_list = [2, 3, 8, 10, 11, 13, 17, 19]
    for i in xrange(1,n+1):
        s=17*i
        if all(s % val == 0 for val in mod_list):
            list=list+[s]

        m=13*i
        if all(m % val == 0 for val in mod_list):
            list1=list1+[m]

        t=7*i
        if all(t % val == 0 for val in mod_list):
            list2=list2+[t]

    #Concatenando las tres listas
    lista_final=list+list1+list2
    #Lista sin repeticiones
    final=unique(lista_final)
    return final


n = 23279256
mult = multiplos(n)

for num in mult:
     if all(num % val == 0 for val in [4, 6, 9, 12, 14, 15, 16, 17]):
         print "Lo has encontrado!",num
     else:
         print "Este no es...D:"

输出:

Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Lo has encontrado! 232792560
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:
Este no es...D:

【讨论】:

  • 请注意,我已经删除了 n 值,所以 num 不存在。在您编写的代码中(顺便感谢您的建议)我需要为 mult 中的每个值更改 num (我已经这样做了)但是当我运行程序时没有任何反应......它会自行关闭
  • @VanesaPiedrahita 那是因为multiplos 函数返回一个空列表。
  • @VanesaPiedrahita 如果您对n 使用很大的值,代码将找到匹配项。以n=50000000 为例。
  • 您可以从您测试的除数列表中删除 4 和 6,因为任何可以被 12 整除的数字也会被它们中的每一个整除。
  • @Blckknght 是的,这是一个很好的观点。在这些方面可能还可以进行更多优化,只是有点超出了 OP 要求我尝试覆盖它们的范围。 (虽然欢迎其他人加入:)。
猜你喜欢
  • 2013-03-15
  • 1970-01-01
  • 2016-08-06
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多