繁体   English   中英

使用列表时“要解压的值太多”

[英]“Too many values to unpack” when using a list

def singlelink(list1, list2):
    print(list1)
    print(list2)
    shortest = sys.float_info.max
    dist = 0.0
    for x1,y1 in list1:
        for x2,y2 in list2:
            dist = math.sqrt((float(x1)-float(x2))**2.0 + (float(y1)-float(y2))**2.0)  
            if dist < shortest:
                shortest = dist
    return shortest

我使用以下代码调用前面的 function

print(singlelink(['51.5217', '30.1140'], ['27.9698', '27.0568']))

当我这样做时,我得到一个 ValueError: too many values to unpack (expected 2)。

每个列表只有两个值,所以不清楚为什么它不只是将它们解包到变量中

python 中的列表或元组解包按以下方式工作。 例如, list1 包含两个元素,因此您将解压缩为a, b = list1 您可以通过以下方式解决问题,而不是使用循环。

def singlelink(list1, list2):
    print(list1)
    print(list2)
    shortest = sys.float_info.max
    dist = 0.0
    x1, y1 = list1
    x2, y2 = list2
    dist = math.sqrt((float(x1)-float(x2))**2.0 + (float(y1)-float(y2))**2.0)  
    if dist < shortest:
        shortest = dist
    return shortest

不可能在循环中做到这一点。

如果每个列表中只有 2 个元素,可以像这样提前解包。

def singlelink(list1, list2):
    print(list1)
    print(list2)
    shortest = sys.float_info.max
    dist = 0.0
    x1, y1 = list1
    x2, y2 = list2
    dist = math.sqrt((float(x1)-float(x2))**2.0 + (float(y1)-float(y2))**2.0)  
    if dist < shortest:
        shortest = dist
    return shortest

这将是由于您处理列表的方式:

for x1,y1 in list1:
        for x2,y2 in list2:

这是导致问题的原因,因为您一次只能解压缩列表中的一个项目。 我认为您可能尝试做的是将它们作为元组列表发送,这将是不同的逻辑。

x1,x2 = list1
y1,y2 = list2

如果您知道列表的元素只会有一个 < 2 的索引,您也可以只访问它们。如果您总是要使用列表,或者想要将其扩展到更长的列表,我只会建议这样做。

dist = math.sqrt((float(list1[0])-float(list1[1]))**2.0 + (float(list2[0])-float(list2[1]))**2.0) 

为了以您想要的方式解包,您不需要任何循环,只需将坐标作为元组提供:

def singlelink(tup1, tup2):
    shortest = sys.float_info.max
    dist = 0.0
    x1,y1 = tup1
    x2,y2 = tup2
    dist = math.sqrt((float(x1)-float(x2))**2.0 + (float(y1)-float(y2))**2.0)  
    if dist < shortest:
        shortest = dist
    return shortest

print(singlelink(('51.5217', '30.1140'), ('27.9698', '27.0568')))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM