【问题标题】:Python - Split a list of integers into positive and negativePython - 将整数列表拆分为正数和负数
【发布时间】:2015-03-15 07:06:52
【问题描述】:

我正在学习 python,我想知道如何拆分列表,例如:

A = [1, -3, -2, 8, 4, -5, 6, -7]

分成两个列表,一个包含正整数,另一个包含负整数:

B = [1, 8, 4, 6]
C = [-3, -2, -5, -7]

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    您可以在 O(n) 中使用 defaultdict()

    In [3]: from collections import defaultdict
    
    In [4]: d = defaultdict(list)
    
    In [5]: for num in A:
       ...:     if num < 0:
       ...:         d['neg'].append(num)
       ...:     else: # This will also append zero to the positive list, you can change the behavior by modifying the conditions 
       ...:         d['pos'].append(num)
       ...:         
    
    In [6]: d
    Out[6]: defaultdict(<class 'list'>, {'neg': [-3, -2, -5, -7], 'pos': [1, 8, 4, 6]})
    

    另一种方法是使用两个单独的列表推导(不推荐用于长列表):

    >>> B,C=[i for i in A if i<0 ],[j for j in A if j>0]
    >>> B
    [-3, -2, -5, -7]
    >>> C
    [1, 8, 4, 6]
    

    或者作为一种纯粹的函数式方法,您也可以使用filter,如下所示:

    In [19]: list(filter((0).__lt__,A))
    Out[19]: [1, 8, 4, 6]
    
    In [20]: list(filter((0).__gt__,A))
    Out[20]: [-3, -2, -5, -7]
    

    【讨论】:

    • 我认为我们可以用一个 for 循环而不是两个 for 循环来做到这一点
    【解决方案2】:

    如果您负担得起对 A 的两次迭代,则列表推导是最好的 IMO:

    B = [x for x in A if x >= 0]
    C = [x for x in A if x < 0]
    

    当然总是有“手动”的方式:

    A = [1, -3, -2, 8, 4, -5, 6, -7]
    B = []
    C = []
    for x in A:
        if (x >= 0):
            B.append(x)
        else:
            C.append(x)
    

    【讨论】:

    • 即使你不能重复两次A,迭代两次A仍然可能是最好的。
    【解决方案3】:

    我们可以使用一个函数通过一个 for 循环来分隔 +ve 数字和 -ve 数字

    def separate_plus_minus(numbers_list):
        positive = []
        negative = []
        for number in numbers_list:
            if number >= 0:
                 positive.append(number)
            else:
                 negative.append(number)
        return positive, negative
    

    用法:

    numbers_list = [-1,5,6,-23,55,0,25,-10]
    positive, negative = separate_plus_minus(numbers_list)
    

    输出:

    positve = [5, 6, 55, 0, 25]
    negative = [-1, -23, -10]
    

    【讨论】:

      【解决方案4】:
      def manipulate_data(alist):
            fo = []
            go = []
            for i in alist:
                  if i < 0:
                        fo.append(i)
                #elif(i > 0):
                     #    go.append(i)
            print fo
          for i in alist:
                  if i > 0:
                        go.append(i)
            print go
      
      def main():
            alist = [54,26,-93,-17,-77,31,44,55,20]
            manipulate_data(alist)
      
      if __name__ == '__main__':
            main()
      

      【讨论】:

        【解决方案5】:

        您也可以像这样在列表理解中使用条件来做到这一点:

        k = [1, -3, 5, 9, -1, 3, -3, -2]
        positive = list()
        negative = [i for i in k if i < 0 or (i > 0 and positive.append(i))]
        

        我很确定这是 O(n) 并且这只有两行。

        【讨论】:

          【解决方案6】:

          我们可以如下使用 lambda:

          list(filter(lambda x: 0 > x, A))
          Output: [-3, -2, -5, -7]
          
          list(filter(lambda x: 0 <= x, A))
          Output: [1, 8, 4, 6]
          

          我们必须将方程 (0

          【讨论】:

          • 使用先前的答案和列表理解更短,并且不需要 lambda 或过滤功能。
          猜你喜欢
          • 2012-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多