создание списка с 2 записями для каждого элемента итератора

1

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

[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

Теги:
list
iterator

4 ответа

1
Лучший ответ
data = [1,10,100]
itertools.chain(*((x,log10(x)) for x in data))

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

  • 0
    Я бы сказал, что этот будет наиболее эффективным, а также довольно читабельным (когда вы поймете, что делают chain и * ). Для import itertools в python этому должно предшествовать что-то вроде from numpy import * и import itertools
  • 0
    На самом деле, это наименее эффективный из 3 опубликованных сообщений - понимание вложенного списка, опубликованное Игнасио, является наиболее эффективным (9,87 против 12,2). не то, чтобы 2 микросенды были поводом для беспокойства. но для интересного объяснения почему, смотрите эту ветку -> stackoverflow.com/questions/952914/…
Показать ещё 1 комментарий
1
sum(([x, math.log10(x)] for x in data), [])
  • 0
    Я вижу, что вы пытаетесь сделать здесь, но это дает мне TypeError: unsupported operand type(s) for +: 'int' and 'list' и я не смог понять, почему ..
  • 0
    Меня устраивает. Вы пропустили параметр [] для sum ?
Показать ещё 1 комментарий
1
>>> 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]
  • 1
    Это то выражение, которое я читаю и думаю в своей голове: «а Python был разработан, чтобы быть читаемым? Riiiight». Не сказать, что это не работает или не является умным ... (или что я не люблю Python, потому что я делаю.) Только то, что синтаксический анализ такого рода списка в моей голове приводит к головной боли.
  • 0
    Проблема с вложенными циклами for заключается в том, что вы должны мысленно выполнить код, чтобы знать, что происходит ... А этот - просто для выравнивания данных
Показать ещё 4 комментария
0

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

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-значения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню