python迭代所有组合的列表元素并执行某些操作

python迭代所有组合的列表元素并执行某些操作,python,list,csv,matrix,Python,List,Csv,Matrix,我在列表中有一些元素,我想对列表中所有元素的组合执行一些矩阵运算 例如,如果我的列表是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

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

例如,如果我的列表是
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.组合怎么样

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
实际上更适合你的情况。因为它跳过相等的值。 因此,将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');
给出

您好,是的,这会起作用,但我在列表中有16个元素,它可以组成240个组合。因此,对每个组合进行条件处理是很困难的,我正在寻找一些更简单的方法。您必须使用列表还是可以对数据进行不同的结构?您好,我也可以使用不同的数据结构,因为我从另一个文件
“排除元素自身的组合(a,a)”
:您的意思是将其从组合运算的结果中排除,还是在这种情况下不增加计数器?排除我的意思是不增加计数。我没有提到它总是3x3矩阵,即使list=['A','C']。当我从文本解析中得到列表时,我可以对数据进行不同的结构。但是如果我们认为矩阵的大小总是3x3和List1=(‘a’,‘c’’),它将在错误的索引中递增,因为列表中的“C”的索引是1,在矩阵中它的(0,2)为(A,C)和(2,0)(C,A),对吗?你是对的。矩阵始终是3x3还是NxN,N是完整ABC列表中的最高索引?字母能否在输入列表中出现两次?否,字母不能在列表中出现两次,且矩阵始终为3x3,因此在下一次迭代中,即使列表中有[a,C]或[B,C],增量也应在3x3矩阵中的相应(i,j)中。因此,您仅限于将[a,B,C]作为输入参数?在另一条评论中,您表示列表中有16个元素??您好,但您的解决方案运行良好,因为它基于NxN作为最高索引。我刚刚修改了第2行和第5行的数据。但总的来说,你的脚本应该表现得很好!!非常感谢。