TypeError:只有length-1数组可以转换为Python标量?

时间:2014-08-05 01:17:00

标签: python typeerror

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

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

1 个答案:

答案 0 :(得分:2)

而不是试图这样做:

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],只有True num % val == 0才会返回True 1}}对所有人来说。

修改:

这是一个完整的工作示例,带有输出。我也简化并加快了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: