【问题标题】:find the unique indices from list从列表中查找唯一索引
【发布时间】:2020-09-02 07:52:36
【问题描述】:

我有两个列表

a = [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0]
b = [4,4]

列表也可能是这样的

a = [1, 1, 1, 4, 1, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0]
b = [1,4]

我需要列表 a 中的索引位置来获取列表 b 中的值

我的预期输出应该(这些是值的索引位置)

output- 
 1. [0,1]
 
 2. [0,3] 

这段代码给出了所有匹配的索引值

c_set = set() 
res = [] 
for idx, val in enumerate(test_list): 
    if val not in oc_set: 
        oc_set.add(val)          
    else: 
        res.append(idx) 

但我需要索引值的长度作为列表 b,正如我在预期输出中提到的那样。

提前致谢

【问题讨论】:

  • 我怀疑set() 方法在您的第一个示例中被破坏,因为您有[4, 4],所以4 的第二个实例将被忽略。我不清楚为什么应该给出[0, 1] 而不是[0, 0] - 这绝对是预期的行为吗?
  • 我无法理解你的问题,请你详细解释一下
  • 输出不加起来,那些指数代表什么?
  • 您出于某种原因在问题的顶部为a 和b 分别给出了两个值,然后您可能为其中一种情况提供了预期的输出...... ? a 和 b 的哪个版本是相关的两个?
  • @roganjosh 因为正如您在我的列表 b 中看到的那样,有两个值,我希望这些值有两个不同的索引。

标签: python list python-2.7


【解决方案1】:

有一点,但有效:

results = [None]*len(b)
for a_index, a_elem in enumerate(a):
    for b_index, b_elem in enumerate(b):
        if a_elem==b_elem and results[b_index]==None:
            results[b_index] = a_index
            a_elem = str(a_elem)
results

提供以下输出:

  1. [0,1]

  2. [0,3]

如果您需要找出最后一个匹配索引而不是第一个匹配索引,它甚至可以工作,只需稍作修改:

results = [None]*len(b)
for a_index, a_elem in enumerate(a):
    for b_index, b_elem in enumerate(b):
        if a_elem==b_elem :#and results[b_index]==None:
            results[b_index] = a_index
            a_elem = str(a_elem)
results

【讨论】:

    【解决方案2】:

    我看不到在这里使用index() 的希望,因为您的第一个示例将给出[0, 0],因为它总是返回第一个实例的索引(如果它存在)。相反,我们可以通过a 逐步分割要搜索的列表。对于每个新切片,我们增加一个offset,这样我们就知道每次找到目标时我们丢失了多少列表。

    我们还可以将要搜索的列表单次转换为一个集合,以 O(1) 检查要搜索的项目是否确实存在于列表中。

    def find(search, targets):
        
        peek = set(search)
        
        res = []
        offset = 0
        for target in targets:
            if target not in peek:
                res.append(None)
                continue
                
            for i, value in enumerate(search):
                if value == target:
                    res.append(i + offset)
                    offset += i + 1
                    search = search[offset:]
                    break
        return res
    
    a = [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0]
    b = [4,4]
    print(find(a, b))
    
    a = [1, 1, 1, 4, 1, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0]
    b = [1,4]
    
    print(find(a, b))
    
    a = [1, 1, 1, 4, 1, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0]
    b = [1, 9, 4]
    
    print(find(a, b))
    

    【讨论】:

      【解决方案3】:

      这行得通吗? try 涵盖了b 中的值不在a 中的情况,这会将None 添加到输出中

      indices = []
      for val in b:
          try:
              idx = a.index(val)
              indices.append(idx)
              a[idx] = None
          except:
              indices.append(None)
      

      输出:[0, 1] 和 [0, 3]

      编辑:@Chris 指出使用 None 是一种更好的方法

      【讨论】:

      • @Chris 很好,最近在思考 numpy 时过于拘谨@.@,为了提高效率而自动进行。考虑一下a.index(val) 可能会更快,因为它已经在 O(n) 中了
      • 感谢您提供这种简单的方法:)
      【解决方案4】:

      根据我对问题的理解:

      a = [1, 1, 1, 4, 1, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0]
      b = [9,4]
      
      [a.index(x) if x in a else None for x in b]
      

      输出:

      [None, 3]
      

      【讨论】:

      • 用第一个例子试试这个。它给了[0, 0]。它不起作用
      【解决方案5】:

      我认为这种方法比其他方法更简单。不过不确定它的性能。

      a = [1, 1, 1, 4, 1, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0]
      b = [1,4]
      resp = []
      
      
      def find_from_a(idx):
          for i, v in enumerate(a, start=idx):
              yield i, v
      
      
      last_idx = 0
      for lookup_val in b:
          for found_idx, found_val in find_from_a(idx=last_idx):
              if found_val == lookup_val:
                  resp.append(found_idx)
                  last_idx = found_idx
                  break
      
      print(resp)
      

      如果您总是需要从头开始,只需删除last_idx 变量并使其始终从头开始。

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 2019-11-11
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多