【问题标题】:Python: Remove duplicates and indicate indexPython:删除重复项并指示索引
【发布时间】:2014-06-18 06:54:49
【问题描述】:

下面是 3D 点组的元组(九个点)

f = [[10, 20, 0], 
    [40, 20, 30], 
    [20, 0, 30], 
    [10, 10, 0], 
    [30, 10, 10], 
    [20, 0, 30], 
    [20, 10, 20], 
    [10, 10, 0],
    [20, 0, 30]]

每个点对应一个特定的数字(索引),表示点的类型(假设)

ic=[1,2,3,2,1,3,2,3,1]

因此,前一个元组可以表示为

f = [[10, 20, 0, 1], 
    [40, 20, 30, 2], 
    [20, 0, 30, 3], 
    [10, 10, 0, 2], 
    [30, 10, 10, 1], 
    [20, 0, 30, 3], 
    [20, 10, 20, 2], 
    [10, 10, 0, 3],
    [20, 0, 30, 1]]

这是我的代码:

uniq = []
dup = []
count = 0
for i, j, k  in f:
    if not [f.index([i,j,k]),i,j,k] in uniq:
        uniq.append([count,i,j,k])
    else:
        dup.append([count,i,j,k,"duplicate"])
    count += 1
uniq.extend(dup)
print(uniq)

for i,j in enumerate(uniq):
    j.append(ic[j[0]])
print(unique)

我想要得到的结果如下图:

独特的部分:

index       point         equivalent points    index for same point
  0      [10, 20, 0, 1]           1                   [1]
  1      [40, 20, 30, 2]          1                   [2]
  2      [20, 0, 30, 3]           3                 [3,3,1]
  3      [10, 10, 0, 2]           2                  [2,3]
  4      [30, 10, 10, 1]          1                   [1]
  6      [20, 10, 20, 2]          1                   [2]

重复部分:

index       point         Duplicate or not
  5      [20, 0, 30, 3]       duplicate
  7      [10, 10, 0, 3]       duplicate
  8      [20, 0, 30, 1]       duplicate

我的代码是为了实现将重复点挑出并在列表中指示其索引的功能。此外,我还需要实现显示我的独特部分中有多少等效点以及这些等效点的索引的功能。

如何修改?

【问题讨论】:

    标签: python indexing duplicates


    【解决方案1】:
    for j in uniq+dup:
        if "duplicate" not in j:
            j += ic[j[0]],f.count(j[1:4]), [ic[j[0]]]
        else:
            j.append(ic[j[0]])    
    
    for i in dup:
        for j in uniq:
            if i[1:4] == j[1:4]:
                j[-1].append(i[-1])
    
    [[5, 20, 0, 30, 'duplicate', 3], [7, 10, 10, 0, 'duplicate', 3], [8, 20, 0, 30, 'duplicate', 1]]
    
    [[0, 10, 20, 0, 1, 1, [1]], [1, 40, 20, 30, 2, 1, [2]], [2, 20, 0, 30, 3, 3, [3, 3, 1]], [3, 10, 10, 0, 2, 2, [2, 3]], [4, 30, 10, 10, 1, 1, [1]], [6, 20, 10, 20, 2, 1, [2]]]
    

    这会将计数添加到每个子列表中,而不会更改您的原始结构。

    【讨论】:

    • 顺便说一句,你能找到一种方法来显示同一点的所有索引,参考更新后的帖子吗?
    • (20,0,30) 有三个相同的点。我想找到他们的索引(3,3,1)
    • 每个点对应一个特定的数字(索引)表示点的类型(假设):ic=[1,2,3,2,1,3,2,3,1]跨度>
    • 老哥,你有什么想法吗?
    • @PythonFun,我已经编辑了我的答案,如果您有大量数据,您可能需要更改代码结构。这适用于较小的数据集,但效率不高。
    【解决方案2】:

    我不确定我是否遵循了您获得索引点的位置,但这是我计算重复项的方式。首先你需要不可变的数据类型来计算,所以将你的子列表更改为真正的元组,并使用collections.Counter 来计算它们:

    import pprint # do your imports first
    import collections
    
    
    f = [[10, 20, 0], [40, 20, 30], [20, 0, 30], [10, 10, 0], [30, 10, 10], [20, 0, 30], [20, 10, 20], [10, 10, 0], [20, 0, 30]]
    t = [tuple(i) for i in f] # we need immutable datatypes to count
    
    counts = collections.Counter(t)
    pprint.pprint(counts)
    

    打印

    {(10, 10, 0): 2,
     (10, 20, 0): 1,
     (20, 0, 30): 3,
     (20, 10, 20): 1,
     (30, 10, 10): 1,
     (40, 20, 30): 1}
    

    正如您可能直觉的那样,Counter 只是 dict 的子类,并且具有所有正常的 dict 方法。

    要获得你的独特性和欺骗性:

    uniques = [k for k, v in counts.items() if v == 1]
    

    返回

    [(10, 20, 0), (30, 10, 10), (40, 20, 30), (20, 10, 20)]
    

    和

    dupes = [k for k, v in counts.items() if v > 1]
    

    返回

    [(20, 0, 30), (10, 10, 0)]
    

    【讨论】:

    • 非常感谢!但是,我不仅需要等效点的数量,还需要这些点的索引。
    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2016-04-06
    • 2019-01-25
    相关资源
    最近更新 更多