2010-08-17 2 views
0

Эй, ребята, это очень сбивает с толку ...находят значение forloop, на котором произошло событие, Python

я пытаюсь найти минимум массива по:

for xpre in range(100): #used pre because I am using vapor pressures with some x molarity 
     xvalue=xarray[xpre] 
     for ppre in range(100): #same as xpre but vapor pressures for pure water, p 
      pvalue=parray[p] 
      d=math.fabs(xvalue-pvalue) #d represents the difference(due to vapor pressure lowering, a phenomenon in chemistry) 
      darray.append(d) #darray stores the differences 
     mini=min(darray) #mini is the minimum value in darray 
     darr=[] #this is to make way for a new set of floats 

всех массивов (xarr , parr, darr) уже определены, а что нет. они имеют по 100 поплавков каждый

так что мой вопрос в том, как найти pvap и xvap @, которые min (darr) найдены?

редактировать изменили некоторые имена переменных и добавил переменных описания, извините ребята

ответ

2

пару вещей:

  1. Попробуйте enumerate
  2. Вместо darr будучи list, использовать dict и сохраните значения dvp в качестве ключей, с переменными xindex и pindex в качестве значений

Вот код

for xindex, xvalue in enumerate(xarr): 
    darr = {} 
    for pindex, pvalue in enumerate(parr): 
    dvp = math.fabs(xvalue - pvalue) 
    darr[dvp] = {'xindex': xindex, 'pindex': pindex} 
    mini = min(darr.keys()) 
    minix = darr[mini]['xindex'] 
    minip = darr[mini]['pindex'] 
    minindex = darr.keys().index(mini) 


    print "minimum_index> {0}, is the difference of xarr[{1}] and parr[{2}]".format(minindex, minix, minip) 
    darr.clear() 

Объяснение

enumerate функция позволяет перебирать список, а также получить индекс элемента. Это альтернатива вашему range(100). Обратите внимание, что у меня нет строки, где я получаю значение в индексе xpre, ppre, это потому, что функция enumerate дает мне как индекс, так и значение как кортеж.

Самое важное изменение, однако, заключается в том, что вместо того, чтобы ваш darr быть список, как это:

[130, 18, 42, 37 ...] 

Теперь словарь, как это:

{ 
    130: {'xindex': 1, 'pindex': 4}, 
    18: {'xindex': 1, 'pindex': 6}, 
    43: {'xindex': 1, 'pindex': 9}, 
    ... 
} 

Так что теперь, вместо того, просто сохраняя значения dvp, я также сохраняю индексы в x и p, которые генерировали значения dvp. Теперь, если я хочу что-то знать, скажем, какие значения x и p производят значение dvp 43? Я хотел бы сделать это:

xindex = darr[43]['xindex'] 
pindex = darr[43]['pindex'] 
x = xarr[xindex] 
p = parr[pindex] 

Теперь x и p являются значения в вопросе.

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

+0

Вам действительно не нужно вообще работать с индексами. – habnabit

+1

Автор спросил, как найти pvap и xvap за минимальное значение, которое они нашли (и соответствующий ему индекс darr). Вам действительно нужно работать с индексами из этих списков, чтобы снова найти их. :) – Andrew

+0

спасибо за объяснение, помогло много :) , но 'minindex = darr.index (mini)' возвращает ошибку; видимо, '' dict 'object не имеет атрибута' index'' – pjehyun

0

Edit: Это не отвечает на вопрос: OP в

min_diff, min_idx = min((math.fabs(a - b), i) for i, (a, b) in enumerate(zip(xpre, ppre) 

справа налево:

зип принимает xpre и PPRE и делает кортеж из 1-го, 2-й, ... элементы, соответственно, например, так:

[ (xpre[0],ppre[0]) , (xpre[1],ppre[1]) , ... ] 

перечисление перечисляет добавляет индекс, просто считая вверх от 0:

[ (0 , (xpre[0],ppre[0])) , (1 , (xpre[1],ppre[1])) , ... ] 

Это распаковывает каждый кортеж nestet:

for i, (a, b) in ... 

я это индекс, порожденный, перечисление, а и б являются элементами xarr и Парра.

Это создает кортеж, состоящий из разницы и индекс:

(math.fabs(a - b), i) 

Все дело в мин между ними (...) является выражением генератора. мин, то находит минимальное значение в этих значениях, и назначение их распаковывает:

min_diff, min_idx = min(...) 
+0

Не могли бы вы объяснить, что вы там сделали? Я очень новичок в программировании в целом :) – pjehyun

+0

Извините, missundestood все это. – pillmuncher