2016-08-25 5 views
2

У меня есть вложенный список около 1 миллиона записей, таких как:Получения конкретных индексированных различных значений во вложенных списках

l = [['a', 'b', 'c', ...], ['d', 'b', 'e', ...], ['f', 'z', 'g', ...],...] 

Я хочу, чтобы получить различные значения внутренних списков по второму индексу, так что мой результирующий список будет например:

resultant = ['b', 'z', ...] 

Я пробовал вложенные петли, но его не быстро, любая помощь будет оценена!

ответ

0

Будет ли это работать на вас?

result = set([inner_list[1] for inner_list in l]) 
+0

, но это должно быть уникальным .... –

+0

Добавлена ​​отливка t к моему ответу. – grael

+1

Да ... Согласен! –

1

Поскольку вы хотите уникальные предметы, которые можно использовать collections.OrderedDict.fromkeys(), чтобы сохранить порядок и уникальные предметы (из-за использования ключей Фро ключи хэш) и использовать zip(), чтобы получить вторые элементы.

from collections import OrderedDict 

list(OrderedDict.fromkeys(zip(my_lists)[2])) 

В Python 3.x, поскольку zip() возвращает итератор вы можете сделать это:

colls = zip(my_lists) 
next(colls) 
list(OrderedDict.fromkeys(next(colls))) 

Или использовать выражение генератора в пределах dict.formkeys():

list(OrderedDict.fromkeys(i[1] for i in my_lists)) 

Демо:

>>> lst = [['a', 'b', 'c'], ['d', 'b', 'e'], ['f', 'z', 'g']] 
>>> 
>>> list(OrderedDict().fromkeys(sub[1] for sub in lst)) 
['b', 'z'] 
0

Я могу представить два варианта.

Комплекта понимание:

res = {x[1] for x in l} 

Я думаю Numpy массивы работают быстрее, чем список/набор постижения, поэтому преобразование этого списка в массив, а затем с помощью функции массива может быть быстрее. Здесь:

import numpy as np 

res = np.unique(np.array(l)[:, 1])  

Поясню: np.array(l) преобразует список в 2d массив, то [:, 1] взять вторую колонку (начиная отсчет от 0), который состоит из второго элемента каждого подсписка в оригинальном l и наконец, используя только уникальные значения, используя np.unique.

1

Вы можете разархивировать список списков, то выбор второй кортеж с множеством, как показано ниже: Этот код принять 4.05311584473e-06 millseconds, в моем ноутбуке

list(set(zip(*lst)[1])) 

Вход:

lst = [['a', 'b', 'c'], ['d', 'b', 'e'], ['f', 'z', 'g']] 

Вывод:

['b', 'z'] 
Смежные вопросы