Python:删除重复项并指示索引

2024-09-27 20:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是三维点编组的元组(九个点)

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

我的代码旨在实现提取重复点并在列表中指示其索引的功能。此外,我还需要实现一个函数来显示我的唯一部分中有多少个等价点,以及这些等价点的索引。你知道吗

我怎样才能修改它?你知道吗


Tags: inforindexcountnotpoint元组print
2条回答
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]]]

这将在不更改原始结构的情况下将计数添加到每个子列表中。你知道吗

我不确定我是否知道你从哪里得到了你的索引点,但这里是我如何计算重复的。首先,您需要不可变的数据类型来计数,所以将子列表更改为实元组,并使用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)]

相关问题 更多 >

    热门问题