【问题标题】:Filtering indexes of list过滤列表的索引
【发布时间】:2018-10-29 21:36:12
【问题描述】:

我有以下数字列表:

List = [1, 2, 3, 4, 5, 6, 15]

我想要那些是 n 倍数的数字的索引,所以我这样做了:

def indexes(List, n):
      # to enumerate the numbers
      E = enumerate(List)
      # filtering tuples
      F = list(filter(lambda x:  x[1] % n == 0, E))
      return [ i[0] for i in F]

     indexes(List, 2)
     [1, 3, 5]

没关系,但是当我添加变量 m 时会发生什么?

def Index( L, n, m):
      # enumeration
      E = enumerate(L)
      # filtering tuples
      F_n = list(filter(lambda x: x[1]%n == 0, E))
      F_m = list(filter(lambda x: x[1]%m == 0, E))
      L_n = [ l[0] for l in F_n]
      L_m = [ J[0] for J in F_m]
      return L_n + L_m

  >>>Index(List, 2, 5):
        [1, 3, 5]

为什么该代码不返回 [1, 3, 5, 4, 6]?

错在哪里?

以及如何创建返回该列表的函数?

【问题讨论】:

  • list(filter(lambda x: x[1] % n == 0 or x[1] % m == 0, E)) 怎么样?
  • 等一下,请注意 filter() 和列表理解或多或少是一回事,尤其是在您的情况下。考虑只使用更易读的列表推导
  • 我不知道 or 运算符可以加入两个列表,谢谢

标签: python python-3.x list iterator iterable


【解决方案1】:

您可以将 列表理解 与 enumerate 方法结合使用。 此外,您可以应用extended iterable unpacking 运算符,以便根据需要传递参数。

List = [1, 2, 3, 4, 5, 6, 15]
def indexes(List, *vars):
   return [index for index, item in enumerate(List) for i in vars if item % i == 0 ]

print(indexes(List, 2, 5))

输出

[1, 3, 5, 4, 6]

【讨论】:

  • 在这种情况下这是一种更加 Pythonic 的方式,但当变量数量增加时就不会那么整洁了。
【解决方案2】:

适用于任意数量变量的更通用和 Pythonic 方法是使用 any() 或 all() 函数来检查所有参数的条件的真值。如果您希望索引属于可整除的项目,请购买您需要的所有参数all(),否则您可以使用any(),它在遇到匹配项后立即返回 True。

def indexes(lst, *args):
    return [i for i, j in enumerate(lst) if any(j % arg == 0 for arg in args)]

演示:

>>> lst = [1, 2, 3, 4, 5, 6, 15, 99, 200, 13, 17, 400]

>>> indexes(lst, 99, 5, 2, 100)
[1, 3, 4, 5, 6, 7, 8, 11]
>>> 

还有all():

>>> indexes(lst, 5, 2, 100)
[8, 11]

【讨论】:

  • @IntiLopez 欢迎您,您也可以通过接受答案告诉社区;))
【解决方案3】:

问题是enumerate returns an iterator from an iterable。一旦用完,就不能再使用了。因此,您可以简单地定义一个新的enumerate 迭代器:

lst = [1, 2, 3, 4, 5, 6, 15]

def Index( L, n, m):

    # enumeration - notice we define 2 objects
    E, F = enumerate(L), enumerate(L)

    F_n = list(filter(lambda x: x[1]%n == 0, E))
    F_m = list(filter(lambda x: x[1]%m == 0, F))
    L_n = [ l[0] for l in F_n]
    L_m = [ J[0] for J in F_m]
    return L_n + L_m

res = Index(lst, 2, 5)

print(res)
[1, 3, 5, 4, 6]

请注意,有更好的方法可以实现您的算法。

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多