Python,使用列表推导式

5

我有以下代码:

a = [[1, 1], [2, 1], [3, 0]]

我想要得到两个列表,第一个列表包含'a'中元素,其中a[][1] = 1,第二个列表包含a[][1] = 0的元素。所以

first_list = [[1, 1], [2, 1]] 

second_list = [[3, 0]]. 

我可以用两个列表推导式来完成这件事:

first_list = [i for i in a if i[1] == 1]

second_list = [i for i in a if i[1] == 0]

但也许存在其他更符合Python风格、更简洁的方法来实现这个功能?感谢您的回答。

6个回答

7
列表推导式非常符合Python风格,也是推荐的做法。您的代码很好。

同意。有两个不同的列表/数据集,因此应使用2个单独的推导式。 - Jordan

3
如果你想让它成为一行,你可以像这样做。
first_list, second_list = [i for i in a if i[1] == 1], [i for i in a if i[1] == 0]

记住,“显式优于隐式”。
你的代码很好。

2
您可以使用sorted()itertools.groupby()来完成此操作,但我不确定它是否符合Pythonic的标准:
>>> dict((k, list(v)) for (k, v) in itertools.groupby(sorted(a, key=operator.itemgetter(1)), operator.itemgetter(1)))
{0: [[3, 0]], 1: [[1, 1], [2, 1]]}

似乎比使用推导式更复杂?但我喜欢使用itertools,所以+1。 - Jakob Bowyer
更加复杂,当然。但随着您想要使用数据执行的任务数量增加,这种解决方案相对而言会变得更快。 - Ignacio Vazquez-Abrams
顺便提一句,运算符是用来做什么的? - Jakob Bowyer

0

这个怎么样?

In [1]: a = [[1, 1], [2, 1], [3, 0]]

In [2]: first_list = []

In [3]: second_list = []

In [4]: [first_list.append(i) if i[1] == 1 else second_list.append(i) for i in a]
Out[4]: [None, None, None]

In [5]: first_list, second_list
Out[5]: ([[1, 1], [2, 1]], [[3, 0]])

我更喜欢使用字典(或defaultdict、OrderedDict、Counter等)而不是两个子列表。

In [6]: from collections import defaultdict

In [7]: d = defaultdict(list)

In [8]: [d[i[1]].append(i) for i in a]
Out[8]: [None, None, None]

In [9]: d
Out[9]: {0: [[3, 0]], 1: [[1, 1], [2, 1]]}

1
仅将列表推导用于副作用是不符合Python风格的。 - Ignacio Vazquez-Abrams
@lgnacio,同意,有时候不使用列表推导式可能更易读(可以用一些for循环的方式替代)。 - sunqiang

0
如果列表比较短,那么两个列表推导式就足够了:在代码全部运行并且你知道它太慢之前,不必担心性能问题。
如果你的列表很长或者代码经常运行并且你已经证明它是一个瓶颈,那么你只需要从列表推导式切换到for循环即可:
first_list, second_list = [], []
for element in a:
    if element[1] == 1:
        first_list.append(element)
    else:
        second_list.append(element)

这段代码既清晰易懂,同时也能轻松扩展到更多情况。


0

列表推导式非常棒。如果你想要稍微简单一些的代码(但是会更长一些),那么就使用for循环。

另一个选择是使用过滤器和映射:

a = [[1, 1], [2, 1], [3, 0]]
g1=filter(lambda i: i[1]==1,a)
g1=map(lambda i: i[0],g1)
g2=filter(lambda i: i[1]==0,a)
g2=map(lambda i: i[0],g2)
print g1
print g2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接