【问题标题】:How to return recurring sequences from a list如何从列表中返回重复序列
【发布时间】:2015-07-31 17:31:31
【问题描述】:

我正在尝试从列表中返回一组重复出现的数字。我想我错过了什么......

list = range(0,10)
K = (1,4)

def f(x):
    for k in K:
        yield [i for i in x if i <= 1+k or i >= 4+k]       

print filter(f, list)

我希望可以为定义设置一个循环。但是输出是[0, 1, 2, 5, 6, 7, 8, 9],显然不是预期的[0,1,2,5,8,9]

那么如何分离值呢?

【问题讨论】:

  • "但是输出是 [0, 1, 2, 5, 6, 7, 8, 9]"。这是?我不明白。我收到IndentationError: expected an indented block。你发错代码了吗?
  • 我确定这只是一个粘贴错误。
  • @Kevin 缩进回车
  • @TigerhawkT3 你是对的,我的错。
  • 您正在寻找的答案是K=4 您得到的答案是(K=4 or K=1)。它是 K=4K=1 的结果的联合,这与您的预期有何不同?

标签: python list


【解决方案1】:

首先,您的代码需要更正如下:

def f(x):
    for k in K:
        yield [i for i in x if i <= 1 + k or i >= 4 + k]

通过此更正,list(f(range(0, 10))) 生成 [[0, 1, 2, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 8, 9]]

下一步是过滤两个集合的交集元素。这可以通过多种方式完成,如问题Find intersection of two lists? 所示。

这是我的首选方法,基于this answer

def intersect(lists):
    count = len(lists)

    if count == 0:
        return []
    elif count == 1:
        return lists
    elif count == 2:
        es1 = set(lists[1])
        return [x for x in lists[0] if x in es1]
    else:
        return intersect((lists[0], intersect(lists[1:])))

现在,使用 intersect 函数在问题中编写的函数的更正版本,您将获得预期的结果,如下所示:

result = list(f(range(0, 10)))
result
# [[0, 1, 2, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 8, 9]]
intersect(result)
# [0, 1, 2, 5, 8, 9]



警告!!

潜在陷阱:
Python 将允许您为变量指定标准函数的名称。但是,这样做会隐藏您使用的名称的函数,使函数隐藏并可能导致意外行为。因此,建议您将 list 变量的名称更改为其他名称。例如,您可以尝试l1list1

【讨论】:

  • @alex list(f(range(0, 10))) 产生“TypeError: 'list' object is not callable”。 intersect() 做得很好。
  • @Prometheus:那是因为你有一个名为list 的变量。此变量现在覆盖内置函数并为您提供您报告的错误。我已经在答案的警告部分解释了这种潜在的影响。参考它并更正您的代码,之后一切正常。
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 2018-11-05
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 2018-06-25
相关资源
最近更新 更多