【问题标题】:Having trouble mapping a list to a list of lists in python无法将列表映射到 python 中的列表列表
【发布时间】:2018-03-03 01:21:20
【问题描述】:

本质上,我需要从映射到另一个间隔列表的值列表创建一个新的列表列表。其中一些值实际上落在区间中的两个子列表的范围内。例如,25 介于 [0,30] 和 [20,55] 之间。然而,一个整数值(例如 91)只落在一个子列表 [75,100] 的范围内。我想创建一个新列表,其中每个值都映射到区间列表,但我希望这些值与区间列表分开。

    intervals = [[0,30], [20,55], [45,80], [75,100]]
    values = [25, 51, 53, 83, 91]

现在我的代码如下:

    maplist = [[]]
    for i in values:
        for j in intervals: 
            if(i >= j[0]) and (i <= j[1]):
                maplist.append(i)
    print(maplist)

这输出到: [[], 25, 25, 51, 51, 53, 53, 83, 91]

因此,如您所见,它输出 25 两次、51 两次和 53 两次,因为这些值位于各个子列表之间。 83和91只落在[75-100]之间

我希望输出是:

    [[25], [25,51,53], [51,53], [83,91]]

这意味着每个值都将映射到列表的间隔列表。任何帮助将不胜感激。

【问题讨论】:

    标签: python list nested-lists


    【解决方案1】:

    列表推导式?

    >>> [[v for v in values if a <= v <= b] for a, b in intervals]
    [[25], [25, 51, 53], [51, 53], [83, 91]]
    

    【讨论】:

      【解决方案2】:

      因此,您可以先循环遍历区间并获取该范围内的所有值。像这样:

      intervals = [[0,30], [20,55], [45,80], [75,100]]
      values = [25, 51, 53, 83, 91]
      
      maplist = []
      for i in intervals:
          inrange = []
          for v in values:
              if v >= i[0] and v <= i[1]:
                  inrange.append(v)
          maplist.append(inrange)
      
      print(maplist)
      

      这将打印 [[25], [25, 51, 53], [51, 53], [83, 91]]

      【讨论】:

      • 感谢您的帮助。不明白自己错过了什么,我感到很愚蠢。
      • 不用担心。你离得不远
      【解决方案3】:

      问题是您要附加到maplist,它被初始化为一个包含一个元素的列表(另一个列表)。当您处理 25 时,您将其附加到 maplist,首先是一次,此时 maplist[[], 25],然后再次为下一个间隔 ([[], 25, 25])。

      相反,您希望每个间隔都有一个列表:

      maplist = [[] for _ in range(len(intervals))]
      for i in values:
          for idx, j in enumerate(intervals):
              if(i >= j[0]) and (i <= j[1]):
                  maplist[idx].append(i)
      

      (如果您不熟悉 enumerate,它会为列表中的项目生成对 (index, item)。)

      【讨论】:

        【解决方案4】:

        使用列表推导式。

        你也正在用另一个列表初始化地图列表..

        maplist = [[x for x in values if i <= x <= j] for i, j in intervals]
        
        print(maplist)
        

        【讨论】:

          【解决方案5】:

          您可以使用collections.defaultdictintervals 中每个value 项目的出现创建更好的映射:

          from collections import defaultdict
          d = defaultdict(list)
          intervals = [[0,30], [20,55], [45,80], [75,100]]
          values = [25, 51, 53, 83, 91]
          for i in values:
            for c, h in enumerate(intervals):
               if i >= h[0] and i <= h[-1]:
                   d[c].append(i)
          
          final_result = [b for a, b in d.items()]
          

          输出:

          [[25], [25, 51, 53], [51, 53], [83, 91]]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-17
            • 1970-01-01
            • 1970-01-01
            • 2011-04-27
            • 2016-09-13
            相关资源
            最近更新 更多