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

次のリストでは、「double」と、最後の項目が 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]]

元のリストの名前を に変更したことに注意してlistくださいmy_list。はPythonのキーワードであるため、実行listしましたが、 an を呼び出すobject 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]]

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 に答える
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 に答える