将列表中的每个项目与列表中的每个其他项目进行比较,检查它们是否属于定义的时间间隔

时间:2016-06-17 08:38:05

标签: python list

我有两个列表a& b,长度N相等,值在[0,1]之间。我想检查具有相同索引的两个列表中的每一对(a [0]与b [0],a [1]与b [1]等等)并根据它们的值,测量属于的次数配对以下状态之一。

列表中的每个元素都可以处于以下状态之一:

1)[0]

2)(0,0.1)

3)(0.1,0.2)

.....

11)(0.9,1)

12)[1]

我的问题是a或b的每个元素都可以处于这12个状态中的一个状态,因此它们的对有可能处于12 * 12 = 144个最终状态之一。

配对状态< - 状态a&国家b

最终状态1< -State 1&州1

最终状态2< -State 1&州2

最终状态3< -State 1&国家3

...

最终国家144< - State 12&国家12

如果我只有一个列表,则可以使用简单的for循环和if / else语句解决问题。我压缩了两个列表,但随后组合太多而无法继续。

有什么想法吗?

如果我有一个例子:

a = [0,0.1,0.25,0.1]

b = [1,0.1,0.4,0.05]

有144个已定义的可能状态对,所以从上面的4个我们有

州1&状态12 = 1(来自[0] -b [0])

州2&状态2 = 2(来自[1] -b [1]和[3] -b [3])

州4&状态5 = 1(来自[2] -b [2])

2 个答案:

答案 0 :(得分:2)

如果我做对了,给出你的两个清单,你需要找出有多少"对"包含来自相同间隔的项目。

这是您可以使用的一个小技巧: 乘以10,然后使用int()去除小数部分。

a = [.11, .22, .33, .55]
b = [.16, .28, .38, .60]
pairs = 0

for (x, y) in zip(a, b):
    if int(x*10) == int(y*10):
        pairs += 1
print(pairs)

如果零本身就是一个状态,那么您需要调整我上面发布的内容来解释这一点,因为int(0*10)int(0,09*10)会得到完全相同的结果。

对问题的编辑:如果你有一个"矩阵"国家,那么实际上可能有一个简单的方法。

w = 12
states = [[0 for x in range(w)] for y in range(w)] # Beware of [[0]*12]*12, that doesn't work

for (x, y) in zip(a, b):
    sx = int(x*10)
    sy = int(y*10)

    if (x != 0):
        sx +=1
    if (y != 0):
        sy += 1
    states[sx][sy] += 1

这会创建一个12 * 12的表,并且对于每一对,递增"单元格"它属于。从那里,你需要提取对的数量,并用适当的"状态x +状态y"前缀它们。标签。

最后注意事项:如果要将结果输出到控制台,则可能需要使用pprint模块。

答案 1 :(得分:0)

对于numpy版本,没有显式循环的类似机器。

import numpy as np

a = [.11, .22, .33, .55]
b = [.16, .28, .38, .60]
Ind = (10*np.array([a,b])).astype(int)
State_mat = np.zeros((12,12),dtype=int)
State_mat[Ind[0],Ind[1]] = 1
State_mat.tolist()

给出相同的输出