0

我正在尝试查找关系中的重复项并从我的列表中省略它们。我已经尝试过嵌套 if 语句,但我还没有得到正确的解决方案。

list = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], [u'polySurface5.e[2]', u'polySurface5.e[2]', 0] ]

在下面的列表中,我想删除“双打”,以及最后一项为 0 的值。我想得到这样的结果:

newlist = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2] ]

我可以通过哪种方式比较 [u'polySurface5.e[4]', u'polySurface5.e[1]', .5] 和 [u'polySurface5.e[1]', u'polySurface5.e[4] ', .5] 并删除第一个之后的任何事件?

非常感谢!

4

3 回答 3

2
my_list = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], [u'polySurface5.e[2]', u'polySurface5.e[2]', 0] ]

new_list = []
my_set = set()
for sublist in my_list:
    if sublist[2] != 0:
        frozen_sub = frozenset(sublist)
        if not frozen_sub in my_set:
            new_list.append(sublist)
            my_set.add(frozen_sub)

结果:

>>> new_list
[[u'polySurface5.e[4]', u'polySurface5.e[1]', 0.5], [u'polySurface5.e[8]', u'polySurface5.e[2]', 0.9], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2]]

请注意,我将原始列表的名称更改listmy_list. 我这样做是因为listis Python 中的一个关键字,但是通过调用 anobject list你正在隐藏它。看一下这个:

>>> list((1,2,3))
[1, 2, 3]
>>> list = [3,4,5]
>>> list((6,7,8))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

编辑:回答后续帖子。

set是一个数据结构,只包含唯一的项目并且项目没有顺序。例如:

>>> set([1,2,2,4,4])
set([1, 2, 4])
>>> set([1,2,4]) == set([4,4,4,1,2])
True

frozenset是类似于set的数据结构,但又有所不同。set是可变的,而frozenset不是;也就是说,我们可以将东西添加到 set 中,但不能添加到frozenset. 但是,frozenset是可散列的,而set不是。这fozenset可以是“字典”中的键或集合中的元素。

可变性:

>>> b = set([1,2,3])
>>> b.add(6)
>>> b
set([1, 2, 3, 6])
>>> d = frozenset([1,2,3])
>>> d.add(6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'

哈希性:

>>> b = set([1,2])
>>> d = set([5,3])
>>> g = set([b,d])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> b = frozenset([1,2])
>>> d = frozenset([5,3])
>>> g = set([b,d])
>>> g
set([frozenset([1, 2]), frozenset([3, 5])])

我希望这有帮助。

于 2012-06-08T02:54:33.733 回答
0
l = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], [u'polySurface5.e[2]', u'polySurface5.e[2]', 0]]
# remove [...,0]
l = filter(lambda i: i[-1] != 0, l)
# sort keys (1st and 2nd field)
l = [sorted(i[:-1]) + i[-1:] for i in l]
# uniques
add_if_unique = lambda res, x: (res + [x]) if x not in res else res
l = reduce(add_if_unique, l, [])
于 2012-06-08T01:33:22.130 回答
0

这个单排怎么样?

l = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5],
     [u'polySurface5.e[8]', u'polySurface5.e[2]', .9],
     [u'polySurface5.e[1]', u'polySurface5.e[4]', .5],
     [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2],
     [u'polySurface5.e[2]', u'polySurface5.e[2]', 0]]

newlist = [list(member) for member in set([tuple(sorted(x[:-1]) + x[-1:]) for x in l if x[-1] != 0])]

print newlist
[[u'polySurface5.e[1]', u'polySurface5.e[4]', 0.5], [u'polySurface5.e[2]', u'polySurface5.e[8]', 0.9], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2]]
于 2012-06-08T08:16:47.480 回答