【问题标题】:Slicing tuples in lists in Python在 Python 中的列表中切片元组
【发布时间】:2020-08-31 20:49:04
【问题描述】:

我有这样的列表:

testList = [[(0.0, -0.9960135495794032), (0.5, -1.0), (2.0, -0.16138322487766676), (2.5, 1.0849272141417852)], 
[(4.0, 3.3149805356833015), (4.5, 0.1649293864654484), (5.0, -1.0), (5.5, 0.33841349597101744), (6.0, 4.702347949145297)], 
[(88.5, 3469038127.7763767), (89.0, 1309004102.449714), (90.0, -1.0)]]

我正在尝试根据元组中的第二个索引对列表进行切片,例如,我希望在元组为 (x, y=-1) 时将每个列表分成两部分。

这是我想要得到的结果:

[[(0.0, -0.9960135495794032), (0.5, -1.0)], [(0.5, -1.0), (2.0, -0.16138322487766676), (2.5, 1.0849272141417852)]]

[[(4.0, 3.3149805356833015), (4.5, 0.1649293864654484), (5.0, -1.0)], [(5.0, -1.0), (5.5, 0.33841349597101744), (6.0, 4.702347949145297)]]

[[(88.5, 3469038127.7763767), (89.0, 1309004102.449714), (90.0, -1.0)], [(90.0, -1.0)]]

我该怎么做?

【问题讨论】:

    标签: python python-3.x list tuples slice


    【解决方案1】:

    在前两种情况下,当你分裂时,你把 (x,y) 对放在你分裂的地方。为了保持一致性,我对第三部分做同样的事情(因此第二部分不是空的)。但是很容易适应。

    testList = [
        [(0.0, -0.9960135495794032), (0.5, -1.0), (2.0, -0.16138322487766676), (2.5, 1.0849272141417852)], 
        [(4.0, 3.3149805356833015), (4.5, 0.1649293864654484), (5.0, -1.0), (5.5, 0.33841349597101744), (6.0, 4.702347949145297)], 
        [(88.5, 3469038127.7763767), (89.0, 1309004102.449714), (90.0, -1.0)]
    ]
    
    def find_y(a, val):
        for i, (x, y) in enumerate(a):
            if y == val:
                return i
        return -1
    
    def split_y(a):
        k = find_y(a, -1)
        if k < 0:
            return a, []
        else:
            return a[:k + 1], a[k:]
    
    for i, u in enumerate(testList):
        l, r = split_y(u)
        print("left%d = %s" % (i + 1, l))
        print("right%d = %s" % (i + 1, r))
    

    注意事项:通常测试浮点值是否相等是一个非常的坏主意。例如,更稳健的测试可能是:

    def approx_eq(a, b, eps=1e-8):
        return abs(a - b) < eps * max(abs(a), abs(b))
    

    【讨论】:

      【解决方案2】:

      你可以试试这个。

      def c_slice(lst):
          for slst in lst:
              start = 0
              for idx,(_,y) in enumerate(slst):
                  if y == -1:
                     yield [slst[start:idx+1], slst[idx:]]
                     break
      

      输出:

      out = list(c_slice(testList))
      
      print(out[0])
      #[[(0.0, -0.9960135495794032), (0.5, -1.0)],
      # [(0.5, -1.0), (2.0, -0.16138322487766676), (2.5, 1.0849272141417852)]]
      
      print(out[1])
      #[[(4.0, 3.3149805356833015), (4.5, 0.1649293864654484), (5.0, -1.0)],
      # [(5.0, -1.0), (5.5, 0.33841349597101744), (6.0, 4.702347949145297)]]   
      
      print(out[2])
      #[[(88.5, 3469038127.7763767), (89.0, 1309004102.449714), (90.0, -1.0)], 
      #  [(90.0, -1.0)]]
      

      【讨论】:

        猜你喜欢
        • 2018-11-21
        • 1970-01-01
        • 2016-02-23
        • 1970-01-01
        • 2018-04-05
        • 2018-08-17
        • 1970-01-01
        • 2018-08-31
        相关资源
        最近更新 更多