如何从列表中删除元组?

时间:2018-10-21 21:58:45

标签: python

每个人。我有一个关于如何从python列表中删除勾股三元组的问题。 具体问题要求我创建一个包含毕达哥拉斯三元组的列表,但是每个三元组只能出现一次。我的功能如下:

import numpy as np

def list_pythagorean_triples(amin,cmax):

    x=list(range(amin,cmax))
    y=[]
    for a in x:
        for b in x:
            c=np.sqrt(a**2+b**2)
            if  c==int(c) and c<=cmax:
                s=a,b,int(c)
                y.append(s)      
    return y

U = list_pythagorean_triples(3,12)

U.sort()

print(U)

我得到[(3, 4, 5), (4, 3, 5), (6, 8, 10), (8, 6, 10)]作为结果。但是,预期的应该是[(3, 4, 5), (6, 8, 10)]

有修改代码的想法吗?非常感谢你!

2 个答案:

答案 0 :(得分:1)

您可以使用一个集合并对元组中的值进行排序,以避免重复:

import numpy as np

def list_pythagorean_triples(amin,cmax):

    x=list(range(amin,cmax))
    y=set() # use a set
    for a in x:
        for b in x:
            c=np.sqrt(a**2+b**2)
            if  c==int(c) and c<=cmax:
                s= (min(a,b), max(a,b), int(c))  # order tuple content by size
                y.add(s)  # sets use add, not append
    return list(y)

U = list_pythagorean_triples(3,12)

U.sort()

print(U)

输出:

[(3, 4, 5), (6, 8, 10)]

答案 1 :(得分:1)

几种解决方法:

您可以先对元组进行排序,然后再进行重复数据删除

def list_pythagorean_triples(amin,cmax):
    x=range(amin,cmax)
    y=[]
    for a in x:
        for b in x:
            c=np.sqrt(a**2+b**2)
            if  c==int(c) and c<=cmax:
                s=a,b,int(c)
                y.append(sorted(s))      
    return sorted(set(y))

或者更好的是,您只能使用比b大的a值。

def list_pythagorean_triples(amin,cmax):
    x=range(amin,cmax)
    y=[]
    for a in x:
        for b in range(a,cmax):
            c=np.sqrt(a**2+b**2)
            if  c==int(c) and c<=cmax:
                s=a,b,int(c)
                y.append(s)      
    return y
相关问题