跟踪计算哪个子集以避免混淆结果

时间:2018-06-29 10:33:44

标签: python list itertools

易记名称和不清楚的名称...

我的问题如下:

import itertools

t0 = 0
tf = 1000000
# inputs_to_compute = list-like of size 2 to 6 of objects

results = [[] for i in range(len(inputs_to_compute))]

for subset in itertools.combinations(inputs_to_compute, 2):
    r1, r2 = compute(subset[0], subset[1], t0, tf)
    results[inputs_to_compute.index(subset[0])] += list(r1)
    results[inputs_to_compute.index(subset[1])] += list(r2)

此代码创建的结果列表与输入的数量一样多。每个输入实际上都与一个列表相关联。然后,对每个子集进行2 x 2的计算,并将结果添加到相应的列表中。

只要输入中没有重复,它就可以正常工作,因为方法index返回元素的第一次出现。我该如何以一种管理重复项的方式来不同地实现这一目标(有效地,性能是我的主要问题之一)?

虚拟示例:

import itertools

def compute(x, y):
    return (x + y, x - y)

inputs_to_compute = [1, 1, 3]

results = [[] for i in range(len(inputs_to_compute))]

for subset in itertools.combinations(inputs_to_compute, 2):
    r1, r2 = compute(subset[0], subset[1])
    results[inputs_to_compute.index(subset[0])].append(r1)
    results[inputs_to_compute.index(subset[1])].append(r2)

输出:

[[2, 0, 4, 4], [], [-2, -2]]

预期输出:

# Iteration (1, 1): r1 = 2, r2 = 0
results = [[2], [0], []]
# Iteration (1, 3): r1 = 4, r2 = -2
results = [[2, 4], [0], [-2]]
# Iteration (1, 3): r1 = 4, r2 = -2
results = [[2, 4], [0, 4], [-2, -2]]

3 个答案:

答案 0 :(得分:1)

for subset_with_indices in itertools.combinations(enumerate(inputs_to_compute), 2):
    i1,x1 = subset_with_indices[0]
    i2,x2 = subset_with_indices[1]
    r1, r2 = compute(x1, x2)
    results[i1].append(r1)
    results[i2].append(r2)

答案 1 :(得分:1)

如果我正确理解了这一点,那么您想在每次重复的1作为subset的一部分返回时在它们之间循环。

执行此操作的一种方法是创建一个以该项为键并将其索引存储在列表中的字典。有了这个字典后,我们可以将itertools.cycle应用于列表,然后使用next()在项目的索引之间循环:

import itertools


def compute(x, y):
    return (x + y, x - y)

inputs_to_compute = [1, 1, 3]

indices = {}
for ind, item in enumerate(inputs_to_compute):
    indices.setdefault(item, []).append(ind)

for k, v in indices.items():
    indices[k] = itertools.cycle(v)

results = [[] for i in range(len(inputs_to_compute))]

for subset in itertools.combinations(inputs_to_compute, 2):
    r1, r2 = compute(subset[0], subset[1])
    results[next(indices[subset[0]])].append(r1)
    results[next(indices[subset[1]])].append(r2)

输出:

>>> %run so.py

>>> results
[[2, 4], [0, 4], [-2, -2]]

答案 2 :(得分:0)

在文档中,您有使用排列组合的秘诀[1]。您只需对其进行修改即可返回索引

import itertools

def compute(x, y):
    return (x + y, x - y)

def combinations(iterable, r):
    pool = tuple(iterable)
    n = len(pool)
    for indices in itertools.permutations(range(n), r):
        if sorted(indices) == list(indices):
            yield tuple(indices)

inputs_to_compute = [1, 1, 3]

results = [[] for i in range(len(inputs_to_compute))]
for i1, i2 in combinations(inputs_to_compute, 2):
    r1, r2 = compute(inputs_to_compute[i1], inputs_to_compute[i2])
    results[i1].append(r1)
    results[i2].append(r2)

print(results)

[1] https://docs.python.org/3/library/itertools.html#itertools.combinations