过滤列表的索引

时间:2018-05-19 18:36:05

标签: python python-3.x list

我有以下数字列表:

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]?

错误是什么?

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

3 个答案:

答案 0 :(得分:3)

您可以将列表理解[[0. 8. 3. 7. 6. 5. 4. 2. 1. 9.]] [[1. 3. 2. 4. 0. 5. 6. 7. 8. 9.]] [[2. 1. 6. 3. 0. 8. 4. 5. 7. 9.]] [[3. 1. 0. 4. 2. 5. 6. 7. 8. 9.]] [[4. 5. 3. 7. 1. 0. 2. 8. 6. 9.]] [[5. 4. 7. 3. 0. 1. 8. 9. 2. 6.]] [[6. 2. 8. 0. 3. 1. 7. 9. 4. 5.]] [[7. 5. 4. 0. 8. 9. 3. 6. 1. 2.]] [[8. 0. 6. 9. 7. 3. 2. 4. 5. 1.]] [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[0] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[1] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[2] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[3] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[4] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[5] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[6] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[7] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[8] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] depot[9] = [[9. 8. 7. 0. 5. 6. 3. 4. 2. 1.]] 方法结合使用。 此外,您可以应用extended iterable unpacking运算符,以便根据需要传递参数。

enumerate

输出

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 :(得分: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]

答案 2 :(得分:1)

问题是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]

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