我要做的是根据共同的元素拆分一些列表,以及它们来自哪个列表的标识符。因此,首先构建一个列表,其中包含所有列表中的所有常用项,然后是列表,其中包含列表子集中存在的列表等。
最好用一个例子来解释它:
list A : [ 2, 4, 6, 8, 10 ]
list B : [ 2, 6, 10, 11 , 13 ]
list C : [ 3, 6, 8, 9 , 11 ]
===> OUTPUT :
( [ A, B, C ] : [6] ) ,
( [ A, B ] : [ 2, 10 ] ) ,
( [ A, C ] : [ 8 ] )
( [ B, C ] : [ 11 ] ) ,
( [ A ] : [ 4 ] ) ,
( [ B ] : [ 13] ) ,
( [ C ] : [ 3 , 9 ]
我可以在纸上找到一种解决方法:
A&B = [2,6,10], A = [ 4,8] , B = [ 11,13 ]
A&B&C = [ 6 ]
和现在A&B becomes [ 2, 10 ]
的交集。 但上面对我来说似乎并不那么pythonic - 而且我是Python的新用户。我可以使用任何库来帮助我这样做吗?我打算使用python 2.7但是如果去Python 3可以帮助我,我可以这样做。
答案 0 :(得分:1)
>>> A=[ 2, 4, 6, 8, 10 ]
>>> B =[ 2, 6, 10, 11 , 13 ]
>>> C =[ 3, 6, 8, 9 , 11 ]
>>> r=set(A+B+C)
>>> l=[[] for i in r]
>>> for index,i in enumerate(r):
add=[]
if i in A:
add.append("a")
if i in B:
add.append("b")
if i in C:
add.append("c")
l[index].extend(add)
>>> d={}
>>> for i in r:
d[i]=0
>>> for index,i in enumerate(d):
d[i]=l[index]
>>> final={}
>>> for i in d.values():
final[tuple(i)]=[]
>>> for k,v in d.items():
final[tuple(v)].append(k)
>>> final
{('c',): [3, 9], ('a',): [4], ('a', 'c'): [8], ('a', 'b'): [2, 10], ('a', 'b', 'c'): [6], ('b', 'c'): [11], ('b',): [13]}
>>>
答案 1 :(得分:1)
我没有足够的声誉来发表评论,我确信这不是最好的方式,但是快速的事情可能有所帮助。
如果您从一个将每个列表与一个字母相关联的字典开头:
lists = {
'A' : [2,4,6,8,10],
'B' : [2,6,10,11,13],
'C' : [3,6,8,9,11]
}
然后,您可以使用与此类似的内容映射事件(如果您不熟悉defaultdict或集合库检查它,它真棒)
from collections import defaultdict
occurrences = defaultdict(list)
for letter, values in lists.items():
for value in values:
occurrences[value].append(letter)
然后你使用另一个dict按值
对事件dict进行分组result = defaultdict(list)
for value, letters in occurrences.items():
result[tuple(letters)].append(value)
你得到了
{('A',): [4],
('A', 'B'): [2, 10],
('A', 'B', 'C'): [6],
('A', 'C'): [8],
('B',): [13],
('B', 'C'): [11],
('C',): [3, 9]}