Я ищу более элегантный способ сделать что-то вроде этого:
[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
data = [1,10,100]
itertools.chain(*((x,log10(x)) for x in data))
затем составить список
sum(([x, math.log10(x)] for x in data), [])
TypeError: unsupported operand type(s) for +: 'int' and 'list'
и я не смог понять, почему ..
[]
для sum
?
>>> 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]
for
заключается в том, что вы должны мысленно выполнить код, чтобы знать, что происходит ... А этот - просто для выравнивания данных
Извините меня за ответ на мой собственный вопрос, но ответы здесь вдохновили меня немного поиграть, и я пришел к чему-то значительно быстрее, чем выше:
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 мс для понимания списков Ignacio, 32,9 мс для JBernaro chain() и 482 мс для суммы Karl(). Я думаю, что сумма() версия теряет, когда она выделяет список длины 2 для каждого x-значения.
chain
и*
). Дляimport itertools
в python этому должно предшествовать что-то вродеfrom numpy import *
иimport itertools