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

Combining two lists into one list where they share the same values and removing duplicates using list comprehensions

我正在尝试合并两个列表: 一个持有平方数。 其他存储五边形数字。

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

我必须使用 List Comprehensions 合并这些列表,其中它们的值匹配,直到列表中有 4 个元素。

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

我目前收到此错误:TypeError: unorderable types: builtin_function_or_method() < int()

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

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_007 现已删除的答案

中的列表 -> 设置和设置交集方法
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
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