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');
给予
我在列表中有一些元素,我想对列表中的所有元素组合执行一些矩阵运算。
例如,如果我的列表是 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');
给予