【问题标题】:Find the previous index value of each tuple element in the list using python [duplicate]使用python查找列表中每个元组元素的前一个索引值[重复]
【发布时间】:2017-06-12 15:40:51
【问题描述】:

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

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 也在同一个下一个元组中,4 出现在第三个元组中,所以答案是 1,1,3

上述列表的预期输出将是这样的[(1,1,0),(1,1,3), ...]

元素位置必须保持原样。在同一位置没有交叉查找。

【问题讨论】:

  • 为什么第二个元组是 (1, 1, 3)?第三个元组中是否存在 4?它在第五个元组中。
  • @Nurzhan: OP 并不意味着4 在第三个元组中表示,而是在第二个元组的第三个元组中表示,即4 在第三个元组中SS1中当前(即第二个)元组的第三个元组的索引
  • @inspectorG4dget 好的。这就是我的想法。
  • 你已经问了 3 次这个问题,但措辞略有不同。 stackoverflow.com/questions/44494022/…stackoverflow.com/questions/44491784/…
  • @kdopen...我是 python 的新手,只有几个星期大,目前正在运行一些巨大的销售预测应用程序,所以将继续在同一个例程中询问...我很抱歉 abt那...我所有的笑声都只是在一个元组中...该做什么...有时是命运...继续前进兄弟...我不会浪费时间...

标签: python


【解决方案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)]

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

【讨论】:

  • 哇...这正是我想要的,我现在不考虑速度,但我将使用你的代码行。任何即兴创作请建议我,我是 python 的几个星期大的新手。对于那个很抱歉。感谢您的大力帮助。你们在摇摆。
  • 对不起兄弟,我自己在 idx, t in enumerate(ListToFind): 中找到它,另一行是 for offset,tup in enumerate(itertools.islice(ListToCompare, idx+1, len(ListToCompare) ), 1):
  • 兄弟...请帮助解决此字典中的每个项目 k,v,其中所有值 v 都是元组,我需要从元组 v 中的所有值中减去 k 值。”跨度>
  • 与此答案无关
  • @JohnEbenezer:如果它与这个问题无关,我建议发布一个新问题
【解决方案2】:

另一种方法(一行):

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 视为一个矩阵,将其转置得到三个列表,分别包含所有第一个元素、第二个元素和第三个元素。
然后,我找到了每个元素下一次出现的索引,并用这些值替换了三个列表。
最后,将矩阵转回原始矩阵,并将内部列表转换为元组

【讨论】:

    【解决方案3】:

    最快的方法是通过列表倒退,保持对给定数字的最新提及的持续列表:

    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) 时间内工作。

    【讨论】:

    • 感谢您的努力,但位置是关键...请查看该回复...我需要处理数百万条记录...请帮助
    • 啊,请原谅不够清晰,我已经修复了它,它现在可以按指定工作了。与@inspectorG4dget 的结果相同,但在 O(n) 时间内。
    • 太好了,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2019-10-10
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多