2017-02-20 35 views
0

我有一个包含数千条记录的子列表列表。 从列表中的样本是这样的:Python中的快速子集子列表

list_full = [ 
    [343, 354,"Sometext1", "Sometext2", "Sometext3"], 
    [43543, 345435,"Sometext1", "Sometext2", "Sometext3"], 
    [4354, 54354,"Sometext1", "Sometext2", "Sometext3", 
     "Sometext4", "Sometext5"] 
] 

我想这个子集主力名单分成两个单独的列表。第一个列表应该有来自子列表的前两个记录,第二个列表应该包含剩余的记录。 作为一个例子,我需要他们存储为:

list_a = [[343, 354], [43543, 345435], [004354, 54354]] 
list_b = [["Sometext1", "Sometext2", "Sometext3"], ["Sometext1", "Sometext2", "Sometext3"], ["Sometext2", "Sometext3", "Sometext4", "Sometext5"]] 

我有以下脚本:

list_1 = [] 
list_2 = [] 

for item in list_full: 
    list_1.append(item[:2]) 
    list_2.append(item[2:]) 

而采用的循环,并且有点慢。有没有更快的方法来执行此列表子集?谢谢!

+1

从您的问题声明看起来像您正在使用某种形式的结构化数据的workig。我建议看看熊猫图书馆,因为它看起来像一个长期的潜在迭代图书馆。它可以让你执行切片,索引和更多功能。 –

+1

我认为你目前的做法很好,其他可能的方法(例如列表解析或'map')将需要遍历'list_full'两次,而不是一次 –

+0

谢谢你的提示。尽管列表理解似乎更快。 – Litwos

回答

1

我会itertools做lazyly:

import itertools 

list1 = itertools.imap(lambda x: itertools.islice(x, 0, 2), list_full) 
list1 = itertools.imap(lambda x: itertools.islice(x, 2, None), list_full) 

这种方法,直到你需要它的计算将不进行评估。请注意,如果您希望立即对其进行评估,则可以调用list()将itertools对象转换为列表。

+0

感谢您的回答。在一小部分数据中,我发现列表理解速度更快。 – Litwos

+0

@Litwos,是的,对于小数据,itertools可能会慢一些,但是当你有大量的时候想想吧:) – Netwave

+0

我在一个更大的子集上再次测试,它比列表理解更快。谢谢 – Litwos

1

试试这个:

# to create two lists 
list_1 = [x[:2] for x in list_full] 
list_2 = [x[2:] for x in list_full] 

# to create two generators, supporting iteration (with for) but not indexing 
list_1 = (x[:2] for x in list_full) 
list_2 = (x[2:] for x in list_full) 

或者,在Python 3,轻松遍历您的数据,而无需创建一个列表:

for a, b, *other in list_full: 
    print("first:", a, b) 
    print("other:", other) 
+0

我不能使用生成器,因为我需要索引。列表理解是数据子集中最快的。谢谢! – Litwos

1

你可以尝试列表理解,

list_1=[item[:2] for item in list_full] 
list_2 = [item[2:] for item in list_full] 

基于一些documents列表理解比循环要快得多。

你可以计算出两者使用timeit方法所用的时间,

from timeit import default_timer as timer 
start=timer() 
list_1 = [] 
list_2 = [] 

for item in list_full: 
    list_1.append(item[:2]) 
    list_2.append(item[2:]) 

print list_1 
print list_2 

end=timer() 

print end-start #Takes 0.0002339 

在使用列表理解,

from timeit import default_timer as timer 
start = timer() 
list_1=[item[:2] for item in list_full] 
list_2 = [item[2:] for item in list_full] 

print list_1 
print list_2 

end = timer() 

print end-start #gives 0.0002105 
+0

我测试了一小部分数据,你的答案是最快的。谢谢! – Litwos

+0

我根据建议对更大的数据样本进行了测试,并使用itertools证明速度更快。我会考虑更小的子集的列表理解! :) – Litwos