【问题标题】:how to get index value of a particular element in list of list?如何获取列表列表中特定元素的索引值?
【发布时间】:2019-08-09 12:18:03
【问题描述】:

我有一个嵌套列表,其中包含一些值和每个列表列表中的 1 个最小值列表。我想在列表列表中找到该最小值的索引值。

我有这样的列表 -

distances=[[6.75, 0.75, 0.25, 2.25, 2.75, 1.75, 5.75, 2.75, 3.75, 7.75], [1.833333333333333, 4.166666666666667, 5.166666666666667, 7.166666666666667, 2.166666666666667, 3.166666666666667, 0.833333333333333, 2.166666666666667, 1.166666666666667, 2.833333333333333]]

以上列表中的最小值列表-

minimum_distance= [0.25, 0.833333333333333]

我试过下面的代码-但是

def find(c):
    for i, distance in enumerate(distances):
        try:
            j = distance .index(c)
        except ValueError:
            continue
        yield i, j

matches = [match for match in find(k for k in minimum_distance)] 
print(matches)

结果列表为空,我想要 [(1,6)]

【问题讨论】:

  • 为什么是列表中的元组?是两个指标吗?首先是距离索引,然后是子列表中的索引?
  • 感谢有价值的 cmets 它的工作,但它的计数索引值从 0 开始。我希望在我的结果中从 1 开始计算第一个索引值。有什么建议吗?

标签: python python-2.7


【解决方案1】:

这是使用list.indexmin 的一种方法。

例如:

distances=[[6.75, 0.75, 0.25, 2.25, 2.75, 1.75, 5.75, 2.75, 3.75, 7.75], [1.833333333333333, 4.166666666666667, 5.166666666666667, 7.166666666666667, 2.166666666666667, 3.166666666666667, 0.833333333333333, 2.166666666666667, 1.166666666666667, 2.833333333333333]]
matches = [i.index(min(i)) for i in distances ]
print(matches)

输出:

[2, 6]

【讨论】:

    【解决方案2】:

    如果你已经计算了minimum_distance,你可以使用zip

    [x.index(y) for x, y in zip(distances, minimum_distance)]
    

    示例

    distances=[[6.75, 0.75, 0.25, 2.25, 2.75, 1.75, 5.75, 2.75, 3.75, 7.75], [1.833333333333333, 4.166666666666667, 5.166666666666667, 7.166666666666667, 2.166666666666667, 3.166666666666667, 0.833333333333333, 2.166666666666667, 1.166666666666667, 2.833333333333333]]
    minimum_distance= [0.25, 0.833333333333333]
    
    print([x.index(y) for x, y in zip(distances, minimum_distance)])
    # [2, 6]
    

    【讨论】:

      【解决方案3】:

      我修改了你的代码:

      def find1(c):
            j = c .index(min(c))
            return j
      matches=[]    
      for match in distances:
          matches.append(find1(match))
      print(matches)
      

      [2,6]

      在您的情况下,您正在调用列表中的函数,该函数将转换为生成器

      【讨论】:

        【解决方案4】:

        我想弄清楚为什么是元组?为什么 2 是 1?您的意思是 [(0,2), (1,6)] 是为了让列表列表中的索引与每个子列表中的最小值索引配对吗?看看你的 find 函数,我猜到了。

        如果您还想要距离索引,那么我的第一个想法是枚举 zip,但解包是有问题的。相反,我们使用 itertools.count 并将所有三个压缩在一起。

        Enumerate two python lists simultaneously?

        from itertools import count
        distances=[[6.75, 0.75, 0.25, 2.25, 2.75, 1.75, 5.75, 2.75, 3.75, 7.75], [1.833333333333333, 4.166666666666667, 5.166666666666667, 7.166666666666667, 2.166666666666667, 3.166666666666667, 0.833333333333333, 2.166666666666667, 1.166666666666667, 2.833333333333333]]
        minimum_distance= [0.25, 0.833333333333333]
        
        print([(i, distance_list.index(minimum)) 
               for i, distance_list, minimum 
               in (zip(count(), distances, minimum_distance))])
        

        [(0, 2), (1, 6)]

        这类似于您的 find 函数正在执行的操作,但通常您需要生成器或列表推导式。

        【讨论】:

          猜你喜欢
          • 2015-09-04
          • 2019-03-03
          • 1970-01-01
          • 2013-12-03
          • 1970-01-01
          • 1970-01-01
          • 2011-05-05
          • 2017-03-01
          • 1970-01-01
          相关资源
          最近更新 更多