首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以迭代方式将列表拆分为交叉点

以迭代方式将列表拆分为交叉点
EN

Stack Overflow用户
提问于 2017-10-09 11:35:10
回答 2查看 68关注 0票数 0

我想要做的是根据某些列表的公共元素分割它们,并给出它们来自哪个列表的标识符。因此,首先构建一个包含所有列表中所有公共项的列表,然后构建一个包含列表子集中的公共项的列表等等。

最好用一个例子来解释:

代码语言:javascript
复制
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,然后从A和B中删除这些项目。A&B = [2,6,10], A = [ 4,8] , B = [ 11,13 ]
  • 然后找到A&B&C = [ 6 ]的交点,现在是A&B becomes [ 2, 10 ]
  • 继续这样迭代和每次更新我的名单,与他们的新内容等。

但是,在我看来,上面的内容并不是那么简单--而且我是Python的一个相当新的用户。我可以使用任何库来帮助我吗?我计划使用python2.7,但是如果使用python 3可以帮助我,我可以这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-09 12:04:34

我没有足够的声誉来发表评论,而且我相信这不是最好的方法,而是一件可能会有帮助的快速的事情。

如果以将每个列表与字母关联的字典开始:

代码语言:javascript
复制
lists = {
 'A' : [2,4,6,8,10],
 'B' : [2,6,10,11,13],
 'C' : [3,6,8,9,11]
 }

然后,您可以用类似于此的东西来映射事件(如果您不熟悉defaultdict或集合库,请检查它,这是非常棒的)

代码语言:javascript
复制
from collections import defaultdict

occurrences = defaultdict(list)

for letter, values in lists.items():
    for value in values:
        occurrences[value].append(letter)

然后,使用另一个dict将出现的数据按值分组。

代码语言:javascript
复制
result = defaultdict(list)
for value, letters in occurrences.items():
    result[tuple(letters)].append(value)

然后你就会得到

代码语言:javascript
复制
 {('A',): [4],
  ('A', 'B'): [2, 10],
  ('A', 'B', 'C'): [6],
  ('A', 'C'): [8],
  ('B',): [13],
  ('B', 'C'): [11],
  ('C',): [3, 9]}
票数 1
EN

Stack Overflow用户

发布于 2017-10-09 12:03:18

你是在参加节目比赛还是别的什么?

代码语言:javascript
复制
>>> 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46645481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档