2016-05-31 52 views
1

我目前正在研究一个模块,它将计算矢量与平面法线之间的角度。无论如何,为了满足计算平面法线的条件,我需要R3中的3点。列表(设置)为嵌套列表?

我已经找到了一种方法将列表元素转换为字符串,但是这会使代码下游复杂化。以下代码块旨在满足此条件。列表t2包含字符串并且顺畅运行,但是我希望使用嵌套列表(t1)。因此,在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,']... 

如果存在含有等价元件3名或多个列表(例如[ '[51,', '158,'])我想追加这些。问题是set()不适用于嵌套列表。

有没有办法解决这个问题? 干杯

+0

你可以转换为嵌套'tuple'的'set'吗? 'set(元组(lst)for lst in l2)' – mgilson

+0

你想使用元组而不是列表。元组基本上与列表相同,除了它们是不可变的。正因为如此,它们可以用作字典(和集合)键。只需使用圆括号代替方括号来创建元组。要将现有列表转换为元组,请使用'tuple(my_list)'。 –

回答

0

万一实例和保存您可以使用OrderedDict键进行元组排序和值数:

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

如果顺序并不重要,你可以使用Counter

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 Ordering实际上对于这个特定的目的非常有用,因为需要大量的索引,所以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'效率很低。 –