我需要找到元组的每个元素的先前索引值。
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), ...]
元素位置必须遵循原样。在相同的位置,没有交叉查找。
答案 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视为一个矩阵,将其转换为三个列表,分别包含所有第一个元素,第二个元素和第三个元素。
然后,我找到了每个元素的下一个出现的索引,并用这些值替换了三个列表
最后,将矩阵转换回原始矩阵,并将内部列表转换为元组