【问题标题】:Python list of conditions to single condition单个条件的 Python 条件列表
【发布时间】:2020-06-30 01:43:48
【问题描述】:

我有一个条件列表,如下所示:

mylist = [['<', 1000], ['<', 100],['<', 25],['>', 10],['>', 5]]

结果是:

mylist = [['<', 25],['>', 10]]

基本上它会采用最小数量的 '' 条件。

最好的方法是什么?

【问题讨论】:

    标签: python string list conditional-statements logic


    【解决方案1】:

    您可以使用itertools.groupby按运算符分组,然后根据需要找到第二个值的最小值/最大值:

    import itertools
    
    mylist = [['<', 1000], ['<', 100],['<', 25],['>', 10],['>', 5]]
    
    out = [min(g) if k == '<' else max(g) for k, g in itertools.groupby(mylist, key=lambda l:l[0])]
    print(out)
    

    输出:

    [['<', 25], ['>', 10]]
    

    注意

    如果您的列表尚未按运算符排序,则应在使用groupby 之前使用list.sort 对其进行排序:

    mylist.sort()
    

    【讨论】:

      【解决方案2】:

      你可以使用min和max,先用filter过滤目标列表:

      mylist = [['<', 1000], ['<', 100],['<', 25],['>', 10],['>', 5]]
      result = [min(filter(lambda x:x[0] == '<', mylist)), max(filter(lambda x:x[0] == '>', mylist))]
      

      【讨论】:

        【解决方案3】:

        您可以尝试使用 min、max 和列表理解:

        mylist = [['<', 1000], ['<', 100],['<', 25],['>', 10],['>', 5]]
        
        ls=[min([i for i in mylist if i[0]=='<'],key=lambda x: x[1]),max([i for i in mylist if i[0]=='>'],key=lambda x: x[1])]
        
        print(ls)
        

        您也可以使用sorted:

        mylist = [['<', 1000], ['<', 100],['<', 25],['>', 100],['>', 5]]
        ls=[sorted(mylist,key=lambda x: (x[0],x[1]))[0],sorted(mylist,key=lambda x: (x[0],x[1]))[-1]]
        print(ls)
        

        两个输出:

        [['<', 25], ['>', 10]]
        

        【讨论】:

          【解决方案4】:

          可以用两条这样的快速行来做到这一点:

          lower = sorted([ele for ele in mylist if '>' in ele], key=lambda x:x[1])[-1]
          upper = sorted([ele for ele in mylist if '<' in ele], key=lambda x:x[1])[0]
          
          print(upper, lower)
          

          输出:

          ['<', 25] ['>', 10]
          

          甚至:

          out = sorted(mylist, key=lambda x: (x[0], x[1]))
          print(out[0], out[-1])
          

          输出:

          ['<', 25] ['>', 10]
          

          【讨论】:

          • 嘿,你能解释一下你的第二个解决方案和我的(在你之前发布的)有什么区别吗?我只是问,因为它可以被视为抄袭。
          • 它是相同核心思想的更简洁更简洁的版本
          • 它与抄袭接壤。这几乎是相同的解决方案,简明扼要。
          • 我个人认为这不是抄袭,我的运行速度甚至会是你的两倍。所有的答案都是在几分钟内发布的,实际上我什至没有看到你的代码
          • 请参阅this,了解可能的重复答案以及如何处理它。也许您在创建答案时没有看到我的代码,但是您在发布答案后看到其他人回答了同样的问题,您应该删除您的代码,或者编辑它以提供不同的解决方案,因为这是抄袭,甚至是间接的。顺便说一句,如果你投了反对票,也许你可以解释一下你为什么这样做。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-05
          • 1970-01-01
          相关资源
          最近更新 更多