Python,使用列表推导

时间:2011-05-27 07:55:20

标签: python list list-comprehension

我有这样的代码:

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]

但也许存在其他(更多pythonic或更短)的方式来做到这一点?谢谢你的回答。

6 个答案:

答案 0 :(得分:7)

列表理解是非常pythonic和推荐的方式。你的代码很好。

答案 1 :(得分:3)

如果您想将它放在一行中,您可以执行类似

的操作
first_list, second_list = [i for i in a if i[1] == 1], [i for i in a if i[1] == 0]

请记住,"明确比隐含更好。"

您的代码很好

答案 2 :(得分: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]]}

答案 3 :(得分: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]])

而不是两个子列表,我更喜欢dict(或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]]}

答案 4 :(得分:0)

如果列表相当短,那么两个列表推导就可以了:在代码全部工作之前你不应该担心性能,而且你知道它太慢了。

如果您的列表很长或者代码经常运行,那么您已经证明它是一个瓶颈,那么您所要做的就是从列表推导切换到for循环:

first_list, second_list = [], []
for element in a:
    if element[1] == 1:
        first_list.append(element)
    else:
        second_list.append(element)

既清晰又容易扩展到更多案例。

答案 5 :(得分: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