【问题标题】:I would like to extract indexes for each element in a list [duplicate]我想为列表中的每个元素提取索引[重复]
【发布时间】:2020-11-20 08:41:42
【问题描述】:

我有两个列表:

list1 = ["A", "B", "C", "D", "E"]

list2 = ["A", "A", "C", "B", "E", "A", "C", "B", "E", "D"]

我想为每个元素创建一个索引列表列表:

[[0,1,5], [3, 7], [2, 6], [9], [4,8]]

我试过这个:

for i in list1:
    list3 = [j for j,x in enumerate(list2) if x == i]
    print(list3)

但我得到了这些不同的结果:

[0, 1, 5]
[3, 7]
[2, 6]
[9]
[4, 8]

【问题讨论】:

    标签: python


    【解决方案1】:

    最简单的方法是再创建一个列表并附加到该列表

    In [28]: list1 = ["A", "B", "C", "D", "E"]
        ...: list2 = ["A", "A", "C", "B", "E", "A", "C", "B", "E", "D"]
    
    In [29]: data = []
    
    In [30]: for i in list1:
        ...:      list3 = [j for j,x in enumerate(list2) if x == i]
        ...:      data.append(list3)
        ...:
    
    In [31]: data
    Out[31]: [[0, 1, 5], [3, 7], [2, 6], [9], [4, 8]]
    

    In [32]: data = []
    
    In [33]: for i in list1:
        ...:      data.append([j for j,x in enumerate(list2) if x == i])
    
    In [35]: data
    Out[35]: [[0, 1, 5], [3, 7], [2, 6], [9], [4, 8]]
    

    【讨论】:

      【解决方案2】:

      你可以把它写成列表推导式。

      >>> list3 = [[j for j,x in enumerate(list2) if x == i] for i in list1]
      >>> list3
      [[0, 1, 5], [3, 7], [2, 6], [9], [4, 8]]
      

      但是,您可以通过仅对 list2 进行一次迭代而不是对 list1 的每个元素进行一次迭代来提高时间复杂度。

      >>> from collections import defaultdict
      >>> d = defaultdict(list)
      >>> for idx, el in enumerate(list2):
      ...     d[el].append(idx)
      ... 
      >>> res = [d[el] for el in list1]
      >>> res
      [[0, 1, 5], [3, 7], [2, 6], [9], [4, 8]]
      

      【讨论】:

        【解决方案3】:

        你可以把它放在另一个列表理解中:

        list1 = ["A", "B", "C", "D", "E"]
        list2 = ["A", "A", "C", "B", "E", "A", "C", "B", "E", "D"]
        list3 =[[j for j,x in enumerate(list2) if x == i] for i in list1]
        print(list3)
        

        【讨论】:

          【解决方案4】:

          你可以使用一个简单的列表推导......像

          [[j for j,x in enumerate(list2) if x == i] for i in list1]
          

          【讨论】:

          • 我的错。。我点击了发布按钮,意识到已经发布了另一个答案。以后我会注意的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-30
          • 2021-03-10
          • 2018-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多