2016-04-29 46 views
0

首先下面是列表不是元组还想追加列表中的数据,并且首先需要知道错误的原因用解决方案错误:太多的值解压缩(预计2) - Python

试图比较两个列表基本上,这里“参考”是参考列表和“obt”是产品列表,而运行代码(下)产生错误。

它的解决方案是什么?

也想将相同的数据帧应用于熊猫,应该是什么代码呢?

ref =[1,2,3,4] 
obt =[0.5,1,1.5,5] 
i,j=0 
for i,j in obt,ref: 
    global i,j 
    if (obt[i] <= ref[j]): 
     print ("all ok") 
    else: 
     print("error") 
    i=i+1 
    j=j+1 
+0

这不是问题,但是你不需要for循环中的'global' –

+0

你应该看看使用'z ip'我相信这是迭代两个列表的最佳方式,您也不需要任何import语句 – northsideknight

回答

0

你也可以使用一个尝试,除了声明如果你正在运行到问题有不同的长度 喜欢的列表:

try: 
    for i, j in obt, ref: 
    # Compare lists 
except: # Enter error after except 
    # Do something else 
1

我想你会很好用zip

for o, r in zip(obt, ref): 
    if o <= r: 
     print ("all ok") 
    else: 
     print("error") 

以下是zip(obt, ref)将会生成的内容:

[(0.5, 1), (1, 2), (1.5, 3), (5, 4)] 

而且,在循环播放时,您可以比较元组中的值。

0

您将需要使用其他变量,然后我和j。这些将被for循环改变。最好使用for x in range(len(list)进行索引

+0

for循环将在每个循环之后重置变量。这不是问题 –

+0

这是真的,但我和j会从列表中获取值,如果您稍后将这些值用作索引,这可能会导致一些问题,如索引错误。所以这就是为什么我也建议这 –

+0

但他们不是索引,他们是列表中的值。首先会有一个IndexError,因为float不能用作索引 –

0

Python for循环实际上是foreach循环。你可以做

ref =[1,2,3,4] 
obt =[0.5,1,1.5,5] 

for i in range(len(ref)): 
    if (obt[i] <= ref[i]): 
     print ("all ok") 
    else: 
     print("error") 

范围功能将遍历数字0到你的阵列,range(len(ref)) = [0,1,2,3]的长度,然后你可以使用它在Python实际上就是抓住这些数字的foreach。

的枚举函数就会给你带来的指数和值,所以你也可以做

ref =[1,2,3,4] 
obt =[0.5,1,1.5,5] 

for i,r in enumerate(ref): 
    if (obt[i] <= r): 
     print ("all ok") 
    else: 
     print("error") 

的枚举函数还给指数和ref[i],它被存储在我和r。这个例子更好地展示了Python的行为如同foreach循环而不是for循环。

的原因错误

上线i,j=0,你必须给J A值一样,所以你会做i,j=0,0。现在在这里发生的是0,0(0,0)是一样的东西。这是一个元组。然后元组必须被解包。当一个元组被解压时,第一个变量i得到第一个值0.第二个变量j得到第二个值。如果元组中有更多的值,这个元组将继续下去,直到元组中的每个值都被解压到某个变量。

一旦解决了这个问题,我们可以继续下一行。 for i,j in obt,ref。再一次,你会看到完全相同的错误。这一次python期待以[(2 value tuple), (2 value tuple), (2 value tuple), (2 value tuple)]的形式迭代一些东西。

zip函数可用于创建此结构,如上所述,或者如果您更喜欢使用for循环中的索引,则可以使用for i in range(len(ref))遍历索引列表[0,1,2,3]。这 只适用于如果ref和obt是相同的长度,否则你必须使用zip。

这两种方式的工作,使用zip或我提到的方法,这取决于你如何解决问题。如果一个列表比另一个长,则zip会截断较长的列表。 Games Braniac提到的itertools.zip_longest解决方案将扩展最短长度列表,使其尺寸相同,然后将其拉伸。

1

这个赋值语句不应该工作:

i,j=0 

试试这个:

>>> i, j = 0, 0 
>>> i 
0 
>>> j 
0 

但是,如果你想比较两个不同的列表这里是你如何做到这一点:

import itertools 
for i, j in itertools.zip_longest(list1, list2): 
    # do stuff with i and j 
    # if either i or j is none then 
    # they are not the same lengths 
+0

使用'i,j = 0,0'并不能完全解决问题。它仍然会在'for,i,j,obt,ref:'中引发同样的错误 –

相关问题