2017-08-17 87 views
1

目前我正在试图遍历三个列表在同一时间:遍历三个列表同步:嵌套循环不工作

list_weight = [0.9,0.3,0.6,0.4] 
list_reliability = [0.8,0.5,0.2,0.8] 
belief_CRED0 = [create_belief_matrix ('ACBA').iloc[0]] 

belief_CRED0 
Out[40]: 
[1 0.562500 
2 0.562500 
3 0.391304 
4 0.391304 
Name: CRED0, dtype: float64] 

首先,我创建了一个嵌套的循环:

for belief in belief_CRED0: 
    for weight in list_weight: 
     for reliability in list_reliability: 
      m = [(1/(1+weight-reliability))*(weight*belief)] 
print(m) 

但结果完全关闭。所以,我想这样做,而不是:

for belief, weight, reliability in zip(belief_CRED0, list_weight, list_reliability): 
    m = [(1/(1+weight-reliability))*(weight*belief)] 
print(m) 

但结果是错误的,以及:

m 
Out[42]: 
[1 0.460227 
2 0.460227 
3 0.320158 
4 0.320158 
Name: CRED0, dtype: float64] 

从什么出来,似乎环路仅使用从相应的列表中的第一权重和可靠性(重量= 0.9,可靠性= 0.8)。

正确的输出应该是:

[1 0.460227 
2 0.210937 
3 0.16770171 
4 0.26086933 

我该怎么办?

+1

有点难以回答不知道什么'[ create_belief_matrix('ACBA')。iloc [0]]'在做。 – MSeifert

+0

你的输出总是只是最后一个'm'集合。正确的答案可能在循环的不同部分。 –

+0

在zip的for循环中有一个错误...你说'm = [...]'...你应该开始'm'作为一个空列表......并且'm.append( (1/...))'。这个嵌套循环完全是错误的。 – motjuste

回答

1

如果他们都pandas.Seriesnumpy.array那么你可以直接做到这一点,如:

>>> weight = pd.Series(list_weight, index=range(1, 5)) 
>>> reliability = pd.Series(list_reliability, index=range(1, 5)) 
>>> 1/(1+weight-reliability)*(weight*belief_CRED0) 
1 0.460227 
2 0.210937 
3 0.167702 
4 0.260869 
dtype: float64 
numpy

同理:

>>> weight = np.array(list_weight) 
>>> reliability = np.array(list_reliability) 
>>> 1/(1+weight-reliability)*(weight*belief_CRED0) 
1 0.460227 
2 0.210937 
3 0.167702 
4 0.260869 
Name: CRED0, dtype: float64 
+0

这真的很高效!我现在要更改我的代码以使用数组。谢谢! – Dine

1

你的for循环zip(这是最好的方法BTW)的一个小错误。收集结果...而不是保留分配给m

m = [] 
for belief, weight, reliability in zip(belief_CRED0, list_weight, list_reliability): 
    m.append(weight*belief/(1+weight-reliability)) 
print(m) 
+0

谢谢你的解决方案!我没有考虑从一个空白列表中工作。 – Dine