代码之家  ›  专栏  ›  技术社区  ›  Maxxx

将值附加到列表中而不重复

  •  0
  • Maxxx  · 技术社区  · 6 年前

    我有一个整数列表,包含:

    intlist = [19,4,2,4]
    

    我想把intlist中的值附加到list的列表中,这样:

    noDuplist = [[19,0],[4,1],[2,2]]
    

    其中,第一个索引表示int列表中的值,第二个索引表示int列表中的值的索引。19位于索引0,4位于索引1,2位于索引2。因为还有另外4个,我不想把它包括进去,因为我不想重复,所以最后4个就被忽略了。

    我试过这样的方法:

    noDuplist = []
    for i in range(len(intlist)):
        if intlist[i] not in noDuplist:
            noDuplist.append([intlist[i],i])
    

    [[19, 0], [4, 1], [2, 2], [4, 3]]
    

    不应该有[4,3]的地方。如果你能帮上忙,我会很感激的

    2 回复  |  直到 6 年前
        1
  •  1
  •   arjoonn    6 年前

    我假设您希望保留原始序列中的索引。 因此,您想要的是记住值在哪个索引处的东西 第一次出现在原始序列中。

    问题出在你的情况下

    if intlist[i] not in noDuplist:
       # something
    

    4 出现在 [[19, 0], [4, 1], [2, 2]]] 但事实并非如此。

    更干净的方法是使用字典或集合

    intlist = [19,4,2,4]
    seen_so_far, noDuplist = set(), []
    
    for i, v in enumerate(intlist):
        if v not in seen_so_far:
            noDuplist.append([v, i])
            seen_so_far.add(v)
    
    print(noDuplist)
    

    输出 [[19, 0], [4, 1], [2, 2]]

        2
  •  0
  •   Eric Le Fort    6 年前

    我想到的第一种方法(不确定是否最佳)是将字典与列表结合使用。无论何时尝试插入值,请检查字典中是否存在该值。如果没有,就把它加到字典和你的单子上。如果有,就不要加。

    这将导致O(N)复杂性。

    编辑 :