我有一个整数列表(那些不是现实生活中的整数,只是为了简单问题),我想过滤积极的和负面的(两个列表都有兴趣)我)
我的解决方案:
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)
答案 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]