2010-08-17 89 views
0

嗨,這是非常混亂...發現價值,在這事件發生的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值存儲爲鍵,其中xindexpindex變量值爲

下面的代碼

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: {'xindex': 1, 'pindex': 4}, 
    18: {'xindex': 1, 'pindex': 6}, 
    43: {'xindex': 1, 'pindex': 9}, 
    ... 
} 

所以現在:

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

現在是這樣一個字典僅僅存儲dvp值,我也將這些索引存儲到xp中,這些值生成了那些值dvp。現在,如果我想知道一些事情,比如說,哪個xp的值會產生值爲43的dvp?我這樣做:

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

現在xp是有問題的值。

注意我個人會存儲產生特定dvp的值,而不是那些值的索引。但你要求索引,所以我給了你這個答案。我假設你有理由想要處理像這樣的索引,但在Python中,一般來說,當你用Pythonic方式進行編程時,你不會發現自己以這種方式處理索引。這是一種非常C的做事方式。

+0

您確實不需要使用索引。 – habnabit 2010-08-17 06:00:57

+1

作者詢問如何找到pvap和xvap的最小值(及其對應的'darr'索引)。實際上,您需要使用這些列表中的索引來再次找到它們。 :) – Andrew 2010-08-17 06:08:38

+0

感謝您的解釋,幫了很多:) 但'minindex = darr.index(微型)'返回一個錯誤;顯然''字典'對象沒有'index'的屬性 – pjehyun 2010-08-17 06:45:06

0

編輯:這不回答OP的問題:

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

從右至左:

拉鍊需要xpre和PPRE,使第一的元組,第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和帕爾的元素的索引。

這建立由差和索引的元組:

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

整個事情其間的分鐘(...)是發電機的表達。 min然後找到這些值中的最小值,然後分配將它們解包:

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

你能解釋一下你在那裏做了什麼嗎?我是一個非常初學者,一般編程:) – pjehyun 2010-08-17 06:15:38

+0

對不起,missundestood整個事情。 – pillmuncher 2010-08-17 06:34:12