2016-05-31 12 views
1

私は現在、ベクトルと平面の法線との間の角度を計算するモジュールに取り組んでいます。ネストされたリストのリスト(設定)?

いずれにせよ、平面の法線を計算する条件を満たすためには、R3に3点必要です。

リスト要素を文字列に変換することでこれを行う方法が見つかりましたが、これはコードの下流を複雑にします。次のコードブロックは、この条件を満たすことを目的としています。リストt2には文字列が含まれており、下流ではうまく機能しますが、ネストされたリスト(t1)を使用したいと考えています。

t1,t2=[],[] #B3 
for i in range(0, len(s)): 
    t1.append([s[i][0][0],s[i][2][4]]) 

    t2.append(s[i][0][0]+s[i][2][4]) 
u,j,k=list(set(t2)),[],[] 
for item in u: 
    j.append(t2.count(item)) 
if len(u) == len(j): 
for i in range(0, len(u)): 
    if j[i] >= 3: 
     k.append([u[i]]) 

#For additional clarity: 
List t1 looks as follows: 
[['[7,', '158,'], 
['[7,', '158,'], 
['[51,', '158,'], 
['[51,', '158,'], 
['[51,', '158,'], 
['[51,', '161,'], 
['[51,', '161,'], 
['[51,', '161,'], 
['[298,', '114,'], 
['[808,', '138,'], 
['[808,', '138,']... 

したがってt1内に同等の要素を含む3つの以上のリストが存在する場合(例えば、[としては '[51、'、 '158、'])私はこれらを追加することを望みます。問題は、set()がネストされたリストでは機能しないことです。

方法はありますか? 乾杯

+0

ネストされた 'tuple'の' set'に変換できますか? '設定(L2でLSTのためのタプル(LST))'あなたはタプルではなく、リストを使用したい – mgilson

+0

。タプルは、不変であることを除いて、本質的にリストと同じです。このため、dict(およびset)キーとして使用できます。角括弧の代わりにかっこを使用してタプルを作成してください。既存のリストをタプルに変換するには、 'tuple(my_list)'を使います。 –

答えて

0

を順序が重要でない場合は、Counterを使用することができ

from collections import OrderedDict 

t1 = [ 
    ['[7,', '158,'], 
    ['[7,', '158,'], 
    ['[51,', '158,'], 
    ['[51,', '158,'], 
    ['[51,', '158,'], 
    ['[51,', '161,'], 
    ['[51,', '161,'], 
    ['[51,', '161,'], 
    ['[298,', '114,'], 
    ['[808,', '138,'], 
    ['[808,', '138,'] 
] 

d = OrderedDict() 
for x in t1: 
    t = tuple(x) 
    d[t] = d.get(t, 0) + 1 

[list(k) for k, v in d.items() if v >= 3] # [['[51,', '158,'], ['[51,', '161,']] 

:インスタンスとキーはタプルがどこにあるか、あなたがOrderedDictを使用することができます順序を保持し、値がカウントされ

from collections import Counter 
from itertools import takewhile 

c = Counter(tuple(x) for x in t1) 
[list(k) for k, v in takewhile(lambda x: x[1] >= 3, c.most_common())] 
+0

@ niemmi OrderedDict()モジュールは非常に便利で、必要に応じて正確に動作するように、多くの索引付けが必要であったため、実際にはこの特定の目的にはかなり便利でした。どうもありがとう! – David

1

setための要素として使用することができます不変、ハッシュ可能タプルにあなたの可変、非ハッシュ可能リストをキャスト:

あなたが三つ以上で全てのリストを取得したい場合には
new_t1 = list(set(map(tuple, t1))) 
new_t1.sort(key=t1.index) # preserves order of first occurrence in original list 
new_t1 = [list(x) for x in new_t1] # back to list of lists 
+0

'sort'で' index'を使うのはかなり非効率的です。 –

関連する問題