迭代表和应用条件,Python

时间:2014-08-25 14:08:49

标签: python conditional-statements

我有两个表表1和表2.表1有一列,表2有两列。我在下面给出了我的两个表的一个例子,以进一步解释我想要做什么。

TABLE 1         TABLE 2
  A             B      C
 0.015         0.000  14.0      #The BINS are 0.00-0.01 = 14.0
 0.033         0.025  14.5                  # 0.01-0.02 = 14.5    
 0.042         0.050  15.0                  # 0.02-0.03 = 15.0 
 0.501         0.075  15.5                  # 0.03-0.04 = 15.5  AND SO ON
 0.505         0.100  16.0                    
 0.520         0.125  16.5
 0.350         0.150  17.0

如果我们在B栏中选择BINS,即0.0到0.01和0.01到0.02等等。

我想选择表1中的A列,取第一个值(0.015)找出它所在的范围(BIN)(我们可以看到它位于0.000和0.025之间),< / strong>我想在表1中添加第二列,并将其值14.5(表2中的第二个BIN)。

我想对表1的第二个值重复相同,即0.033,我们可以看到它介于0.025和0.050之间,所以我们给它值15.5(来自表2)。等等。

问题是,我知道迭代的唯一方法是使用for循环,

for a in A:  #takes the values of column A in table 1

但在这里我不知道如何继续前进。的即。如何检查B列的哪个BIN对我的A列值是什么?以便我可以从C列中给它相应的值

2 个答案:

答案 0 :(得分:2)

您可以将a乘以40,然后将其转换为int,并将其用作表2中的索引。

例如,取第一个值(0.015)并将其乘以40(0.6)并将其转换为int(0),然后在表2中得到所需的索引。

D = list()
for a in A:
    index = int(a*40)
    try:
        corresponding_value_from_c = C[index]
    except IndexError:
        corresponding_value_from_c = C[-1]
    D.append(correspondin_value_from_c)

最后,D将是包含您需要的所有值的列。

答案 1 :(得分:2)

您可以使用for i, x in enumerate(X)遍历列表。这为您提供了列表的元素和该元素的索引。您也可以使用for i in range(len(X)),因为在您的情况下,您可能需要进行预测。也许这适用于具有任意箱尺寸的解决方案:

A2 = []
for a in A:
    for i in range(len(B)-1):
        if a < B[i+1]:
            A2.append(C[i])
            break
    else:    # We never broke out
        A2.append(C[-1])

我们将A中的每个元素与B中逐渐增大的元素进行比较。如果元素a小于B中列表元素的值,则它属于上一个bin(即来自0.015的{​​{1}}小于{{1}在A中,因此属于上一个bin)。细分,因为你问:

0.025

我们不是直接在B上进行迭代,而是循环遍历可能的索引(从A2 = [] # Make a new list for a in A: # Do the below once for every element in A for i in range(len(B)-1): 开始到B结束)。 然而,我们实际上比这更少。如果您使用0,则最终会得到len(B)-1。因此,如果您想迭代所有range(10),则可以使用0...9。但我们实际上想要比B的全长更少,因为在下一步中,我们展望未来。

range(len(B))

此处我们正在查看一个列表索引,以查看B是否小于索引 if a < B[i+1]: 处的a元素。如果是,那么我们希望找到与{em>之前的索引对应的B元素,即索引i+1。例如,从列表C中给出i,我们会从0.015查看A0.025,这意味着B属于上一个bin。这就是我们展望未来的原因。

0.015 < 0.025

抓住与0.015对应的 A2.append(C[i]) break 元素(不再向前看,因为我们知道C是正确的bin,因为i太大了)把它扔进i。然后i+1退出内部A2循环,然后使用break的下一个元素重新开始。

for

如果我们从A循环中 else: # We never broke out A2.append(C[-1]) else,那么break语句就会执行。在这种情况下,for只能位于最后的bin中,因此我们只需从a中获取位于列表末尾的元素(C将自动执行)。< / p>