查找发生事件的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 值存储为键,并将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)。请注意,我没有在索引xpreppre 处获取值的行,这是因为enumerate 函数将索引和值作为元组提供给我。

然而,最重要的变化是,您的 darr 不再是这样的列表:

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

现在是这样的字典:


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

所以现在,我不仅将dvp 值单独存储,还将索引存储到xp 中,它们生成了dvp 值。现在,如果我想知道一些事情,比如说,哪个xp 值产生dvp 值43?我会这样做:

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

现在xp 是有问题的值。

注意我个人会存储产生特定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中的最大值

查找个人最近发生的事件

查找时间范围以限制日历中同一时间发生的事件。 (django)

如何使用pyspark查找时间范围内每分钟发生的事件

pythonfor循环结束后关机

当事件在某一天发生多次时查找详细信息