【问题标题】:Python: Remove repeated element when doing duplicates countingPython:在进行重复计数时删除重复的元素
【发布时间】:2014-08-02 00:14:26
【问题描述】:

下面是 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]]

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

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]]

这是我的代码:

def selectUnique(x):
    count = Counter((i[0], i[1], i[2]) for i in x)
    out = [i for i in x if count[(i[0], i[1], i[2])] == 1]
    return out

selectUnique(f)

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

独特的部分:

index       point         equivalent points    index
  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

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

但是,我的代码不起作用,我该如何修改它?

【问题讨论】:

  • 具体做错了什么?
  • 我需要做的是计算点,当点中的三个值都等于前一个时,它会发生重复。
  • '我的代码不起作用' - 它会产生什么错误,如果有的话?我试过了,一切正常,你得到了你想要的正确结果。
  • set([tuple(i) for i in f]) 能解决您的问题吗?

标签: python for-loop duplicates tuples


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

[[0, 10, 20, 0], [1, 40, 20, 30], [2, 20, 0, 30], [3, 10, 10, 0], [4, 30, 10, 10], [6, 20, 10, 20], [5, 20, 0, 30, 'duplicate'], [7, 10, 10, 0, 'duplicate']]

for j in (uniq):
    j.append(ic[j[0]])
print uniq


 [[0, 10, 20, 0, 1], [1, 40, 20, 30, 2], [2, 20, 0, 30, 3], [3, 10, 10, 0, 2], [4, 30, 10, 10, 1], [6, 20, 10, 20, 2], [5, 20, 0, 30, 'duplicate', 3], [7, 10, 10, 0, 'duplicate', 3]]

【讨论】:

  • 顺便说一句,我怎样才能在我更新的帖子中实现输出?
  • 我想对重复和索引进行深入研究,如何修改您的代码并获得我更新后的结果?
  • @PythonFun,我编辑了我的答案,这是你想要的吗?
  • 当我运行你的代码时,它告诉我“列表索引超出范围”。顺便说一句,我希望重复项可以在每个元组中显示“重复”元素。
  • 我添加了不同的代码,它将 ic 的值添加到相应的子列表中。
【解决方案2】:

如果您不介意替代解决方案...

f=[tuple(x) for x in f]
set(f)

【讨论】:

  • OP 想要一个列表列表,这是一组元组。
【解决方案3】:

通过检查count[(i[0], i[1], i[2])] == 1],您已经消除了所有多次发生的项目。您可以只返回计数器的键来获取去重版本

def selectUnique(x):
    count = Counter((i[0], i[1], i[2]) for i in x)
    return count.keys()

【讨论】:

  • 非常感谢您的回答。但是我怎样才能按顺序列出它们并指出它们的索引呢?
  • @PythonFun,你能更新你的帖子以反映你想要的确切输出吗?
【解决方案4】:

编辑:此答案符合原始规范

这是另一种方法:

def selectunique(lst):
    a = set()
    return [x for x in lst if tuple(x) not in a and not a.add(tuple(x))]

对于

for point in selectunique(f):
    print(point)

输出是

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

【讨论】:

  • 您的回答非常好。但是,如何指示这些重复项的索引?
  • @PythonFun 您希望索引作为 selectunique 函数中内置的返回值,还是在获取唯一点列表后进行测试?
  • 我希望索引作为 selectunique 函数内置的返回值。请参考我的更新输出。
  • @PythonFun 我看到您同时为您的扩展规范得到了很好的答案。我的方法不会那么容易适应新的规范,而且看起来很丑。猜猜没关系,因为你得到了答案 - 干杯:)
  • 我改变了 f 的形式: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]]
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2013-05-20
相关资源
最近更新 更多