3

好吧,我有这个例子:

mylist = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]

它是一个列表列表。我想保留每个子列表的前 5 个点。如果这是一个简单的列表,我会调用mylist[:5],仅此而已。现在,我能想象的最简单的方法是遍历 mylist 并将每个子列表的前 5 个点复制到一个新列表中。

newlist = []
for i in mylist:
    newlist.append(i[:5])

但是如果我的列表长度超过 10.000+,会发生什么。你知道更快的方法吗?

4

4 回答 4

9

好吧,你可以使用列表推导来做同样的事情,这样至少它会变得更短一些。

return [x[:5] for x in mylist]

或者,如果将您的函数改为生成器,您还可以生成单个元素:

for x in mylist:
    yield x[:5]
于 2013-10-06T21:44:39.973 回答
0

一种功能性方法:

map(operator.itemgetter(slice(0, 5)), mylist)
于 2013-10-07T12:14:09.253 回答
0

如果您试图使过程扩展,您可能也应该对内部列表使用生成器:

g = lambda k: (k[i] for i in range(5))
for x in mylist:
    yield g(x)
于 2013-10-06T21:57:02.797 回答
0

实现它的另一种方法:

return map(lambda lst: lst[:5], mylist)
于 2013-10-06T21:55:18.210 回答