将两个列表合并为一个共享相同值的列表,并使用列表理解删除重复项

2024-10-01 04:48:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将两个列表结合起来: 一个有平方数。 其他存储五边形数字。你知道吗

def pentaSquares():
    l = []
    n = 0
    squares = lambda x: [x*x for x in  range(n)]
    penta = lambda y: [y*(3*y-1)//2 for y in range(n)]
    while l.index < 4:
        l = [i for i in squares for j in penta if squares == penta]
        n = n+1
    return l

我必须使用列表理解合并这些列表,使它们的值匹配,直到列表中有4个元素。你知道吗

如果有人能给我指出正确的方向,我将不胜感激。你知道吗

我现在得到这个错误:TypeError: unorderable types: builtin_function_or_method() < int()


Tags: lambdain列表forindexreturnifdef
2条回答
def pentaSquares(n):
    squarlist=[x*x for x in range(n)]
    pentalist=[y * (3*y-1) // 2 for y in range(n)]
    l=[x for x in squarlist if x in pentalist]
    return l

>>> pentaSquares(10000)
[0, 1, 9801, 94109401]

编辑1 O.p满意度

def pentaSquares(n):
    squarlist=[]
    pentalist=[]
    squares = lambda x:x*x
    penta = lambda y:y*(3*y-1)//2
    for i in range(n):
        squarlist.append(squares(i))
        pentalist.append(penta(i))
    l=[x for x in squarlist if x in pentalist]
    if l < 4:
        print('there are less than 4 values, input larger n')
    return l

使用一对发电机应该可以在不占用世界上所有内存的情况下给出这个答案。对于任何结果列表大小,这都应该很好地工作(尽管可能需要很长时间)。你知道吗

import itertools

squares = (x*x for x in itertools.count(0))
pentas = (y * (3*y-1) // 2 for y in itertools.count(0))

results = []

cur_s, cur_p = next(squares), next(pentas)
# prime the pump

while len(results) < 4:
    if cur_s == cur_p:
        results.append(cur_s)
        # success

    # advance the generator with the smaller current result
    if cur_s > cur_p:
        cur_p = next(pentas)
    else:
        cur_s = next(squares)

没有理由在这个任务中使用列表理解法,但是如果必须的话,你应该在cricket\u007的现在删除的答案中使用列表->;设置和设置交叉点方法

for n in range(itertools.count(0)):
    squares = [x * x for x in range(n)]
    pentas = [y * (3*y-1) // 2 for y in range(n)]
    result = set(squares).intersection(set(pentas))
    if len(result) >= 4:
        break

相关问题 更多 >