我有这样的代码:
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或更短)的方式来做到这一点?谢谢你的回答。
答案 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)
另一种选择是过滤器和地图:
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