我有整数列表:
[[1,2,3,4,5,6,7,8,9],
[1,2,-7,-6,-5,-4,-3,10,11,12],
[3,4,-5,6,7,8,11,12,2,2],
[etc]]
我需要找到所有列表中保存的主题。在这里,结果只有一个主题(我手动找到):
[[3,4,5,6,7],
[-7,-6,-5,-4,-3],
[3,4,-5,6,7]]
“motif”是指在所有列表中找到的一系列数字(至少2位数):这里举例说明,在这个连续的顺序中找到数字3,4,5,6,7在所有列表中,尽管在第二个列表中顺序相反。 理想情况下,图案的检测将允许少量差异
有什么想法吗?
我认为使用networkX可以帮助我识别“派系”,但我找不到能帮助我解决这个问题的功能。
答案 0 :(得分:0)
您可以首先根据子列表的绝对值找到所有子列表之间的一个相交,然后遍历所有子列表并找到所需的交集:
def find_intersection(m_list):
temp=[map(abs,i) for i in m_list]
v=set(temp[0])
for k in temp[1:]:
v=v.intersection(k)
for i,k in enumerate(m_list):
m_list[i]={t for t in k if abs(t) in v}
return m_list
l=[[1, 2, -3, 4, -5, 6, 7, 8, 9], [1, 2, -7, -6, -5, -4, -3, 10, 11, 12], [3, 4, -5, 6, 7, 8, 11, 12, 2, 2]]
print find_intersection(l)
结果:
[set([2, 4, 6, 7, -5, -3]), set([2, -7, -6, -5, -4, -3]), set([2, 3, 4, 6, 7, -5])]
答案 1 :(得分:0)
a是你的清单
In [78]: b=[[abs(i) for i in elem] for elem in a]
In [81]: c=list(set.intersection(*map(set, b)))
In [84]: [list({i for i in elem if abs(i) in c}) for elem in a]
Out[84]: [[2, 3, 4, 5, 6, 7], [2, -7, -6, -5, -4, -3], [3, 4, -5, 6, 7, 2]]