создание списка с 2 записями для каждого элемента итератора - PullRequest
1 голос
/ 05 сентября 2011

Я ищу более элегантный способ сделать что-то вроде этого:

[data[i/2] if i%2==0 else log10(data[i/2]) for i in xrange(len(data)*2)]

Итак, если данные были [1,10,100], я хочу составить список:

[1,0,10,1,100,2]

fyi: это для вывода в CSV-файл

Ответы [ 4 ]

1 голос
/ 05 сентября 2011
data = [1,10,100]
itertools.chain(*((x,log10(x)) for x in data))

затем составьте список

1 голос
/ 05 сентября 2011
sum(([x, math.log10(x)] for x in data), [])
1 голос
/ 05 сентября 2011
>>> data = [1, 10, 100]
>>> [x for y in data for x in (y, math.log10(y))]
[1, 0.0, 10, 1.0, 100, 2.0]
0 голосов
/ 07 сентября 2011

Извините, что ответил на мой собственный вопрос, но ответы здесь вдохновили меня немного поиграть, и я пришел к чему-то значительно более быстрому, чем выше:

import itertools
import numpy
data = range(1,10000)
[x for y,z in itertools.izip(data,numpy.log10(data)) for x in (y, z)]

Дело в том, что numpy.log10() более эффективен, чем многократный вызов math.log10(). С 10000 целыми числами я получил 4,59 мсек против 32,8 мсек для понимания списка Игнасио, 32,9 мсек для цепи JBernaro () и 482 мсек для суммы Карла (). Я предполагаю, что версия sum () проигрывает, когда она выделяет список длины 2 для каждого значения x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...