найти значение forloop, при котором произошло событие Python - PullRequest
0 голосов
/ 17 августа 2010

Эй, ребята, это очень запутанно ...

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

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 (дарр)?имена и добавленные описания переменных, извините, ребята

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Пара вещей:

  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.Это очень C способ делать вещи.

0 голосов
/ 17 августа 2010

Редактировать: Это не отвечает на вопрос ОП:

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

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

zip принимает 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 ...

i - это индекс, сгенерированный перечислением, a и b - элементы xarr и parr.

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

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

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

min_diff, min_idx = min(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...