【发布时间】: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
我正在学习 python,我想知道如何拆分列表,例如:
A = [1, -3, -2, 8, 4, -5, 6, -7]
分成两个列表,一个包含正整数,另一个包含负整数:
B = [1, 8, 4, 6]
C = [-3, -2, -5, -7]
【问题讨论】:
标签: python python-3.x
您可以在 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]
【讨论】:
如果您负担得起对 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仍然可能是最好的。
我们可以使用一个函数通过一个 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]
【讨论】:
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()
【讨论】:
您也可以像这样在列表理解中使用条件来做到这一点:
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) 并且这只有两行。
【讨论】:
我们可以如下使用 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
【讨论】: