查找发生事件的forloop的值Python
Posted
技术标签:
【中文标题】查找发生事件的forloop的值Python【英文标题】:find value of forloop at which event occurred Python 【发布时间】:2011-03-30 19:14:30 【问题描述】:嘿伙计们,这很令人困惑......
我正在尝试通过以下方式找到数组的最小值:
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 个花车
所以我的问题是如何找到找到 min(darr) 的 pvap 和 xvap @?
编辑 更改了一些变量名并添加了变量描述,对不起各位
【问题讨论】:
【参考方案1】:几件事:
-
试试
enumerate
不要将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 中,当您以 Python 方式编程时,通常不会发现自己以这种方式处理索引。这是一种非常 C 的做事方式。
【讨论】:
作者询问如何找到 pvap 和 xvap 的最小值(及其对应的darr
索引)。您确实需要使用这些列表中的索引才能再次找到它们。 :)
感谢您的解释,帮了大忙 :) 但minindex = darr.index(mini)
返回错误;显然'dict' object has no attribute 'index'
我更新了它,它是darr.keys().index()
。不过,我不知道你为什么需要这些信息。知道dict.keys()
中的值的索引尤其没用,但一般来说,如果您设计的 Python 程序正确,则不需要跟踪索引。
@dhillon 是的,我不......我只是被所有这些新语法弄糊涂了,有时我忘记了最初的目标:P。如果您不介意,您认为您可以通过 IM 或其他方式帮助我吗?我知道现在问可能有点晚了,而且问的太多了,更不用说代表我们双方都面临严重的互联网安全风险,但我不喜欢那样。
抱歉,总的来说我很忙。我能提供的最大帮助是回答关于 SO 的偶尔问题。此外,我认为最好的学习来自于实践。您还可以尝试 irc.freenode.org 上的#python 频道 信息:python.org/community/irc【参考方案2】:
编辑:这没有回答 OP 的问题:
min_diff, min_idx = min((math.fabs(a - b), i) for i, (a, b) in enumerate(zip(xpre, ppre)
从右到左:
zip 采用 xpre 和 ppre 并分别制作第一个、第二个、... 元素的元组,如下所示:
[ (xpre[0],ppre[0]) , (xpre[1],ppre[1]) , ... ]
enumerate enumerates 通过从 0 向上计数来添加索引:
[ (0 , (xpre[0],ppre[0]) ) , (1 , (xpre[1],ppre[1]) ) , ... ]
这会解包每个嵌套元组:
for i, (a, b) in ...
i是enumerate生成的索引,a和b是xarr和parr的元素。
这构建了一个由差异和索引组成的元组:
(math.fabs(a - b), i)
min(...) 之间的全部内容是一个生成器表达式。 min 然后在这些值中找到最小值,然后赋值将它们解包:
min_diff, min_idx = min(...)
【讨论】:
你能解释一下你在那里做了什么吗?我是一个非常初学者的一般编程:) 对不起,误解了整个事情。以上是关于查找发生事件的forloop的值Python的主要内容,如果未能解决你的问题,请参考以下文章
python怎样用最简单的for loop求list中的最大值