使用python

时间:2017-06-12 15:40:51

标签: python

我需要找到元组的每个元素的先前索引值。

SS1=[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 2, 6), (1, 3, 4), (1, 3, 5), (1, 3, 6), (1, 4, 5), (1, 4, 6), (1, 5, 6), (2, 3, 4), (2, 3, 5), (2, 3, 6), (2, 4, 5), (2, 4, 6), (2, 5, 6), (3, 4, 5), (3, 4, 6), (3, 5, 6), (4, 5, 6)]

在第一个元组1,2,3中,1发生在下一个元组本身,2发生在下一个元组中,3个发生在该位置的任何元组中,因此它是0 ...所以现在回答是1,1,0

并且对于第二个元组1,2,4,并且在下一个元组中存在1,在同一个下一个元组中存在2,在第3个元组中存在4,所以答案为1,1,3

上述列表的预期输出将与此[(1,1,0),(1,1,3), ...]

类似

元素位置必须遵循原样。在相同的位置,没有交叉查找。

3 个答案:

答案 0 :(得分:1)

这是一个简单的方法(虽然它可能不是最快的):

SS1 = [(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 2, 6), (1, 3, 4), (1, 3, 5), (1, 3, 6), (1, 4, 5), (1, 4, 6), (1, 5, 6), (2, 3, 4), (2, 3, 5), (2, 3, 6), (2, 4, 5), (2, 4, 6), (2, 5, 6), (3, 4, 5), (3, 4, 6), (3, 5, 6), (4, 5, 6)]

answer = []
for idx, t in enumerate(SS1):
    offsets = [None]*len(t)
    for i, n in enumerate(t):
        for offset,tup in enumerate(itertools.islice(SS1, idx+1, len(SS1)), 1):
            if tup[i] == n:
                offsets[i] = offset
                break
    offsets = [0 if os is None else os for os in offsets]
    answer.append(tuple(offsets))

输出:

In [12]: answer
Out[12]: [(1, 1, 0), (1, 1, 3), (1, 1, 3), (1, 0, 3), (1, 1, 6), 
          (1, 1, 2), (1, 4, 2), (1, 1, 4), (1, 5, 1), (0, 6, 3), 
          (1, 1, 0), (1, 1, 2), (1, 0, 2), (1, 1, 3), (1, 2, 1), 
          (0, 3, 2), (1, 1, 0), (1, 0, 1), (0, 1, 1), (0, 0, 0)]

如果您真的想以线性空间成本改善运行时间,可以使用字典进行一些预处理来改进它

答案 1 :(得分:0)

最快的方法是在列表中倒退,保留最新提及给定数字的持续列表:

def previous_index(SS1):
    answer = []
    last_reference = [dict(), dict(), dict()]
    input_rev = SS1.copy()
    input_rev.reverse()
    for idx, tup in enumerate(input_rev):
        answer_tup = []
        for t_idx, value in enumerate(tup):
            if value in last_reference[t_idx]:
                answer_tup.append(last_reference[t_idx][value])
                last_reference[t_idx][value] = idx
            else:
                answer_tup.append(0)
                last_reference[t_idx][value] = 0
        answer.append(tuple(answer_tup))
    answer.reverse()
    return answer
编辑:我误解了这个问题,并认为元组中的位置并不重要。它现在按指定的方式工作,并在O(n)时间内工作。

答案 2 :(得分:0)

另一种方法(在一行中):

list(map(tuple,zip(*[[item.index(r,idx+1)-idx if r in item[idx+1:] else 0 for idx,r in enumerate(item)] for item in list(map(list, zip(*SS1)))])))

在这里,我将SS1视为一个矩阵,将其转换为三个列表,分别包含所有第一个元素,第二个元素和第三个元素。
然后,我找到了每个元素的下一个出现的索引,并用这些值替换了三个列表 最后,将矩阵转换回原始矩阵,并将内部列表转换为元组