【问题标题】:Printing indices for common elements in two list打印两个列表中常见元素的索引
【发布时间】:2021-06-24 04:25:10
【问题描述】:

我正在尝试打印 x 和 y 中常见元素的索引列表。因此,在下面的示例中,[5,6,8,9,11] 在每个示例中都很常见,所以我希望我的输出是常见元素的索引列表,所以在这种情况下,[0,1,3,4,6]。我尝试了下面的代码,但我只得到一个空列表[] 作为我的输出,我不知道从这里去哪里。任何帮助将不胜感激。

x= [5,6,7,8,9,10,11,12]
y=[5,6,8,9,11]

y=[]
for i in range(0,len(x)):
    if x[i] in y:
        y.append(i)
print(y)

【问题讨论】:

  • 你覆盖了y!!
  • 您可以通过修改这些更改轻松修复它; y = []res = []y.append(i)res.append(i)
  • @balandongiv ya 我看到了,但我没有创建字典,因为有更优雅的解决方案,比如答案中提到的解决方案。

标签: python list


【解决方案1】:

首先 - 您正在覆盖 y。因此,您将x[] 进行比较。
此外,您正在更新y,同时在循环中与它进行比较。如果我见过的话,那很容易出错......

接下来,为什么不使用简单的列表理解?

indices_of_stuff_in_x_thats_also_in_y = [i for i, x_ in enumerate(x) if x_ in y]
print(indices_of_stuff_in_x_thats_also_in_y)
# [0, 1, 3, 4, 6]

最后一条评论 - 请注意您的原始定义听起来有点对称(“x 和 y 中常见元素的索引列表”)。但它不是也不能是,因为你在谈论索引......

【讨论】:

    【解决方案2】:

    您可以使用enumerate 函数来获取公共元素的索引。

    您可以使用.index(),但这可能会导致问题,因为它会获取所提供元素第一次出现的索引。

    这是一个工作代码。

    list1 = [5,6,7,8,9,10,11,12]
    list2 = [5,6,8,9,11]
    list3=[j for j,i in enumerate(list1) if  i in list2]
    print(list3)
    

    【讨论】:

      【解决方案3】:

      你必须使用装饰器。这是 Pythonic,您必须尽可能编写 Pythonic 代码:

      import math
      import operator
      import functools
      
      def filter(func):
          def _(f):
              @functools.wraps(f)
              def _(args):
                  return f.__call__(list.__call__(__builtins__.filter.__call__(func, args)))
              return _
          return _
      
      def transform(func):
          def _(f):
              @functools.wraps(f)
              def _(args):
                  return f.__call__(func.__call__(args))
              return _
          return _
      
      def map(func):
          def _(f):
              @functools.wraps(f)
              def _(args):
                  return f.__call__(list.__call__(__builtins__.map.__call__(func, args)))
              return _
          return _
      
      y = [5, 6, 8, 9, 11]
      
      @transform(enumerate)
      @filter(lambda v: y.__contains__(operator.itemgetter(int(round(math.pi.__mul__(pow(int(math.e).__mul__(int(math.pi + math.e)), int(math.pi.__add__(math.e)))), pow(hash(math.inf), next(v for k, v in __builtins__.__dict__.items.__call__() if k.__eq__(y.__class__.__name__)).__call__().__len__.__call__()).__neg__())).__sub__(hash(math.inf)))(v)))
      @map(operator.itemgetter(hash(math.nan)))
      def solve(v):
          return v
          
      print(solve([5, 6, 7, 8, 9, 10, 11, 12]))
      # Outputs [0, 1, 3, 4, 6]
      

      【讨论】:

      • 我已经更新了我的答案,使其更具可读性。也许现在是时候删除反对票了?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 2015-06-05
      • 2020-06-16
      • 2018-07-08
      • 2021-12-28
      相关资源
      最近更新 更多