在给定标准的情况下将列表分成2个列表

时间:2016-09-23 13:33:00

标签: python list filter

我有一个整数列表(那些不是现实生活中的整数,只是为了简单问题),我想过滤积极的和负面的(两个列表都有兴趣)我)

我的解决方案:

main_list = [50,-354,10,34,-56,10]

negatives = list(filter(lambda x : x < 0,main_list))
positives = list(filter(lambda x : x >= 0,main_list))

有效但执行2次filter次操作

for i in main_list:
    if i < 0:
        negatives.append(i)
    else:
        positives.append(i)

有效但不是非常pythonic。

创建集合并从主列表中减去正项目不是一个选项,因为它使用了不必要的散列。

那么有更优雅的方式吗? (单行赞赏)

编辑:我发现一个不太糟糕(与原始问题的答案不同)的方式在没有太多测试的情况下加入它

for i in main_list:  (negatives if i < 0 else positives).append(i)

2 个答案:

答案 0 :(得分:2)

根据原始条件,您可以使用itertools.groupby

>>> from itertools import groupby
>>> {str(k):list(g) for k, g in groupby(sorted(main_list), key=lambda x: x < 0)}
{'False': [10, 10, 34, 50], 'True': [-354, -56]}

但是,除非你计算两种方法的表现,否则无法判断这是否比两个列表推导或 for 循环(看起来没问题)更有效。

答案 1 :(得分:0)

如何将原始副本的副本作为positives开始,然后一次性从negatives中删除的项目填充positives

  

利用pop的回复

main_list = [50, -354, 10, 34, -56, 10]

positives = main_list[:]
negatives = [positives.pop(positives.index(x)) for x in main_list if x < 0]
print(positives)  # -> [50, 10, 34, 10]
print(negatives)  # -> [-354, -56]