列表(设置)嵌套列表?

时间:2016-05-31 03:37:07

标签: python math

我目前正在开发一个模块,用于计算矢量和平面法线之间的角度。

无论如何要满足计算平面法线的条件,我需要在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()不适用于嵌套列表。

有解决方法吗? 干杯

2 个答案:

答案 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())]