2012-11-20 3 views
2

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

for dat in data_body: 
    x = float(dat[5]) 
    y = float(dat[6]) 
    point = ogr.Geometry(ogr.wkbPoint) 
    point.AddPoint(x,y) 
    feature.SetGeometry(point) 
    for i, d in enumerate(dat): 
     for j, field in enumerate(new_fields): 
      if i == j: 
       feature.SetField(field, d) 
       layer.CreateFeature(feature) 

Для моих наборов данных, список списков data_body имеет 13 строк данных и 55 столбцов (т.е. 55 позиций). Для моего списка new_fields У меня есть 55 значений, которые соответствуют столбцам списка data_body. Таким образом, в моем кодовом блоке для объекта feature.SetField(field, d). Мне нужно, чтобы каждое значение data_body соответствовало каждому уникальному полю, если строки совпадают друг с другом, то есть i и j. Однако, скорее, возвращение объекта с 13 строками данных, соответствующими значениям столбца, соответствующим значениям в new_fields. Я получаю значения 13 * 55, т. Е. 715 строк, где значения отсутствуют для ~ 50% данных. Моя таблица данных выходных данных выглядит как треугольник данных.

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

+0

вы должны перебрать 'Перечислит (Даты)' и 'enumerate (new_fields)' в то же время, а не один внутри другого ... – avasal

+0

@avasal, спасибо за подсказку. Но, как бы я это сделал, одновременно? – hylaeus

+0

@avasal, я использовал функцию 'zip', но я все равно получаю тот же результат. Какие-либо предложения? – hylaeus

ответ

2

Как сказал avasal, вы хотите перебрать Даты и new_fields в то же самое время, и самый простой способ сделать это состоит в использовании zip:

for d, field in zip(dat, new_fields): 
    feature.SetField(field, d) 
    layer.CreateFeature(feature) 
+0

спасибо @ acjohnson55. Я сделал это, но, к сожалению, я все равно получаю тот же результат. как раньше с вложенным циклом. Я продолжу расследование, почему это может произойти. Но спасибо за объяснение функции zip! И я отредактирую свой код, надеюсь, лучше решу вопрос. – hylaeus

+0

Я думаю, что теперь может произойти то, что первая часть цикла для 'dat' в' data_body' ассоциирует 'x' и' y' (значения в списке 'new_fields') с позициями 5 и 6 в' dat ', которые являются строками в' data_body'. Возможно, мне даже не нужен второй цикл, и мне просто нужно выяснить способ прокрутки «new_fields» и «data_body» один раз и связать каждое значение 'dat' с соответствующей позицией' new_fields'. FYI: ('len (new_fields)' = 55) и ('len (data_body)' = 13) с каждой строкой 'data_body' =' len' из 55) – hylaeus

+0

Что ожидает SetField? Вы пытаетесь присвоить одни и те же значения 'new_fields' каждому элементу в' dat_body'? Возможно, вы хотите, чтобы итерация выполнялась только над 'dat', а затем выполнялась функция feature.SetField (new_fields, d)' – acjay

Смежные вопросы