Как сопоставить функцию с тройным вложенным списком и сохранить нетронутым тройной вложенный список? - PullRequest
3 голосов
/ 01 сентября 2011

Я строю рабочий процесс анализа для моей докторской степени и использую тройной вложенный список для представления своей структуры данных, потому что я хочу, чтобы она могла расширяться до произвольного объема данных на его втором и третьем уровнях.Первый уровень - это весь набор данных, второй уровень - это каждый субъект в наборе данных, а третий уровень - это строка для каждого показателя, который соответствует каждому субъекту.

[dataset]
      |
      [subject]
              |
              [measure1, measure2, measure3]

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

for subject in dataset:
    for measure in subject:
        map(float, measure)

... результат правильный и именно то, чтоЯ хочу, но проблема в том, что я не могу думать, как эффективно присвоить результат обратно набору данных или без потери уровня гнезда.В идеале я хотел бы изменить меру * вместо , но я не могу думать, как это сделать.

Не могли бы вы предложить эффективный и питонический способ сделать это?Является ли тройной вложенный список глупым способом организации моих данных в программе?

Ответы [ 4 ]

14 голосов
/ 01 сентября 2011

Вместо того, чтобы делать это на месте, создайте новый список

 dataset = [[[float(value) for value in measure] 
                           for measure in subject] 
                           for subject in dataset] 
3 голосов
/ 01 сентября 2011

return [[map(float, measure) for measure in subject] for subject in dataset]

Вы можете вернуть список вместо того, чтобы изменять его на месте - это все еще удивительно эффективно и сохраняет всю необходимую информацию.(в сторону: на самом деле, это часто быстрее, чем присвоение индексам списков [необходимо цитирование], что другие предложили здесь!)

2 голосов
/ 01 сентября 2011

Это должно сделать работу

for subject in dataset:
    for measure in subject:
        for i, m in enumerate(measure):
            measure[i] = float(m)
2 голосов
/ 01 сентября 2011

Простой способ сделать это на месте:

for subject in dataset:
    for measure in subject:
        for i, elem in enumerate(measure):
            measure[i] = float(elem)

В качестве альтернативы, используйте оператор среза для обновления списка на месте с результатами map

for subject in dataset:
    for measure in subject:
        measure[:] = map(float, measure)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...