python 遍历所有组合的列表元素并执行一些操作

python iterate over list elements for all combinations and perfom some action

我在列表中有一些元素,我想对列表中的所有元素组合执行一些矩阵运算。

例如,如果我的列表是 list1 = ['A', 'B', 'C'],考虑这样的 3x3 矩阵:

0 0 0    
0 0 0    
0 0 0  

例如,A [(A,A),(A,B),(A,C)] 的组合应该看起来像

0 1 1   
1 0 0    
1 0 0  

为每个组合递增 1 并排除元素自己的组合 (A,A)

我尝试了类似这样的非常基本的操作,但没有得到所需的输出:

data =[[0, 0, 0] for line in range(3)]    
x = ['A', 'B', 'C']
for z in x:
    if z == 'A':
        if 'B' in x:
            data[0][1]+=1
            data[1][0]+=1
        elif 'C' in x:
            data[0][2] += 1
            data[2][0] += 1

matrix = "\n".join([",".join([str(num) for num in item]) for item in data])
print matrix

怎么样itertools.combinations:

list1 = ['A', 'B', 'C']
for i in range(0, len(list1) + 1):
  for j in itertools.combinations(list1, i):    # gets all subsets j
    # if j matches criteria, increment

实际上 itertools.permutations 更适合您的情况。因为它跳过了相等的值。 因此,一个简单的示例将 A 的组合递增 1,B 的组合递增 10,如下所示:

data =[[0, 0, 0] for line in range(3)]    
x = ['A', 'B', 'C']
# we need the permutations of the indexes
xv = range(len(x))
for i,j in itertools.permutations(xv,2):
    #combinations of A
    if 'A' in (x[i], x[j]): 
        data[i][j] += 1
    #combinations of B
    if 'B' in (x[i], x[j]): 
        data[i][j] += 10

如果您想对所有排列应用相同的函数,只需跳过 if 部分。

一个稍微更高级的版本,它根据使用的字母调整数据矩阵的大小并打印结果矩阵,看起来像

import string
#ABC -> 012 map
abc = {i:j for j,i in enumerate(string.uppercase)}
#012 -> ABC map
abcinv = string.uppercase
#input
x = 'ADEC'
xm = abc[max(list(x), key=ord)] + 1
# data matrix
data = np.zeros((xm, xm))
# we need the permutations of the indexes
xv = [abc[i] for i in x]
for i,j in itertools.permutations(xv,2):
    data[i][j] += 1

#ensure diagonal is empty
np.fill_diagonal(data, 0)
plt.imshow(data, interpolation='none', cmap='Greys');
plt.axis('off');

给予