父程序的目标是生成排列并找出由生成过程生成排列的概率。我希望通过列表对相同排列进行排序。
因此,列表中的每个元素的格式均为[[[a,b,c],[x]],[[d,e,f],[y]],....]
,其中x表示在一个循环中生成[a,b,c]
的概率。我下面有我的输出之一。
[[[1, 2, 3], [0.125]],[[1, 2, 3], [0.125]],[[2, 3, 1], [0.125]],[[2, 1, 3], [0.125]],[[3, 1, 2], [0.125]],[[1, 2, 3], [0.125]],[[1, 3, 2], [0.125]],[[1, 2, 3], [0.125]]]
当我的最终列表包含[[a,b,c],[x]]
和[[a,b,c],[y]]
时,我将需要它成为[[a,b,c],[x+y]]
。我该怎么做?
我尝试了以下代码。输出列表称为master_list。
for i in range(0,len(master_list)):
count = []
for j in range(i+1,len(master_list)):
if master_list[i][0] == master_list[j][0]:
count.append(j)
master_list[i][1][0] += master_list[j][1][0]
else:
continue
print('count for element',master_list[i][0], 'at number', i, 'is', count)
for k in count:
print(k)
for c in range(0,len(count)):
master_list.remove(master_list[k])
print('master_list now is',master_list)
count[c] += -1
打印语句仅供我检查。但是,我遇到的问题是,在每个.remove()操作之后,列表的索引已更改,因此循环中断了。
答案 0 :(得分:0)
与其从那里迭代原始列表删除元素(list.remove()为O(n) [ref]),一种更有效的方法是通过中间字典,然后再次创建列表。 / p>
from collections import defaultdict
res = [[[1, 2, 3], [0.125]], [[1, 2, 3], [0.125]], [[2, 3, 1], [0.125]], [[2, 1, 3], [0.125]], [[3, 1, 2], [0.125]],
[[1, 2, 3], [0.125]], [[1, 3, 2], [0.125]], [[1, 2, 3], [0.125]]]
grouped_res = defaultdict(float)
for perm, prob in res:
grouped_res[tuple(perm)] += prob[0]
new_res = [[list(k), [v]] for k, v in grouped_res.items()]
# [[[1, 2, 3], [0.5]], [[2, 3, 1], [0.125]], [[2, 1, 3], [0.125]], [[3, 1, 2], [0.125]], [[1, 3, 2], [0.125]]]