我在列表中有一些元素,我想对列表中的所有元素组合执行一些矩阵运算。
例如,如果我的列表是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
答案 0 :(得分:1)
实际上itertools.permutations
更适合您的情况。因为它跳过相同的值。
一个简单的例子将A加一个组合和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');
给出
答案 1 :(得分:0)
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