我目前正在开发一个模块,用于计算矢量和平面法线之间的角度。
无论如何要满足计算平面法线的条件,我需要在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 :(得分:0)
将可变的,不可清除的列表转换为不可变的,可散列的元组,可用作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
答案 1 :(得分: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())]