变量类型是列表,但是python说对象类型float没有属性len

时间:2018-09-27 23:46:27

标签: python-3.x

我正在使用Python 3,代码如下

# Uses python3
import sys

def get_optimal_value(capacity, weights, values):
    value = 0.
    left_space=capacity
    vpw=[]
    for i in range (0,len(weights)-1):
        print (i)
        vpw.append(values[i]/weights[i])
    vpw_s=[]
    v_s=[]
    w_s=[]
    k=0
    vpw=list(vpw)
    print (type(vpw))
    while (len(vpw) > 0):
        j = vpw.index(max(vpw))
        vpw_s.append(vpw[j])
        v_s.append(values[j])
        w_s.append(weights[j])
        vpw=vpw.pop(j)
        k=k+1

    for i in range (0, len(w_s)-1):
        if (left_space> 0):
            w_u=min(w_s[i],left_space)
            value=value+w_u*vpw_s[i]

    # write your code here

    return value

if __name__ == "__main__":
    opt_value = get_optimal_value(10, [3,4,1], [10,12,80])
    print("{:.10f}".format(opt_value))

这给出了一个错误-

<class 'list'>
Traceback (most recent call last):
  File "/home/main.py", line 35, in <module>
    opt_value = get_optimal_value(10, [3,4,1], [10,12,80])
  File "/home/main.py", line 16, in get_optimal_value
    while (len(vpw) > 0):
TypeError: object of type 'float' has no len()

变量vpw是否不是类型列表?

2 个答案:

答案 0 :(得分:0)

问题不在于您第一次执行while,而是第二次。您已进入循环:

    vpw=vpw.pop(j)

但是,return value from pop()实际上是您弹出的元素,并且列表已在适当位置修改,因此您将vpw从列表更改为浮点数,因此第二次执行{ {1}}您正在尝试以浮点数进行while。简单的解决方法是删除作业:

len()

答案 1 :(得分:0)

问题不是在第一次迭代时发生,而是在第二次以后,您说{result -> tempTextView.text = "${result.main.temp}" minTempTextView.text = "${result.main.temp_min}" }, vpw=vpw.pop(j)从该索引返回值并从列表中删除,因此vpw是现在是浮点数。您可以通过将打印类型放入while循环中来尝试此操作。我建议阅读this,以了解您要做什么,我相信您需要pop