Python фильтр рассчитывает значения из больших списков, чтобы создать несколько небольших списков - PullRequest
2 голосов
/ 10 августа 2011

Я хочу найти оптимальный метод для обработки очень больших упорядоченных списков целых чисел, например.

biglist = [45, 34, 2, 78, 7, 9, 10, 33, 78, 51, 99, 24, 88, ... N] where N > 1m

, чтобы создать несколько небольших списков фиксированной длины S (~ = 200), читая каждый элемент biglistразличные операции над элементом, и, если он соответствует условным критериям, добавьте элемент или значение в каждый небольшой список до достижения S, например.

x_smallist = []
y_smallist = []
z_smallist = []
count = 0
for i in biglist:
    b = i / 5
    a = b * 2
    c = a^3 + b
    if b > 7 and b < 69:
        x_smallist.append(i)
        y_smallist.append(a)
        z_smallist.append(b)
        count += 1
    if count > S:
        break

Пример и функция приведены только для иллюстрации.Так как biglist большой, каждый элемент читается и обрабатывается до тех пор, пока не будет достигнут S, а процесс повторяется тысячи раз, я хочу избежать цикла for.Как этого достичь с помощью понимания списка (или карты или фильтра)?

Ответы [ 3 ]

0 голосов
/ 10 августа 2011
S = 200
import itertools
biglist = itertools.islice(itertools.ifilter(lambda x: 7 < x/5 < 69, biglist),S)

или если вам нужно несколько кусков, просто примените ifilter, а затем зациклите результат.

0 голосов
/ 10 августа 2011

Я думаю, что следующее должно делать то, что вы хотите, это работает, когда генератор выдает кортеж с новым элементом для каждого списка, а затем использует zip для создания трех списков, которые вы хотите. Итератор для biglist создается в начале, так что каждый раз в цикле вы выбираете, где остановились, и используется islice, чтобы генератор останавливался на S элементах.

itr = iter(biglist)
while True:
    lists = itertools.islice(((i, i/5*2, i/5) for i in itr if 7 < i/5 < 69), S)
    x_smallist, y_smallist, z_smallist = zip(*lists)
    if len(x_smallist) == 0:
        break       # reached the end of biglist
    # do stuff with your small lists
0 голосов
/ 10 августа 2011

Действительно ли biglist должен быть списком?Если вы можете создать их с помощью генератора, вы можете сохранить память и, возможно, сэкономить время.

...