2017-02-20 15 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

Я думаю, что ваш нынешний подход просто прекрасен, другие возможные подходы (такие как понимание списков или «карта») потребуют повторного использования над 'list_full' дважды, а не один раз –

+0

Спасибо за советы. Однако понимание списков происходит быстрее. – Litwos

ответ

1

Я хотел бы сделать это lazyly с itertools:

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

Смежные вопросы