python - Python 2.** 从列表中查找两个列表组合的所有可能交集的并集
问题描述
免责声明:我正在自学 Python,所以我的每个问题都可能有一些简单的解决方案。耐心值得赞赏!
我知道标题有点不清楚,所以我会尝试用一个例子来澄清一下。
假设我们有一个交易数组:
txArray=[[u'1'],[u'2'],[u'2', u'3']]
目标是编写一个函数myIntersection(arrayOfLists)
,首先计算每个可能的列表对的交集txArray
,然后取并集。
所以myIntersection(txArray)
应该返回[u'2']
,因为:
int1=intersection([u'1'],[u'2'])=[]
int2=intersection([u'1'],[u'2', u'3'])=[]
int3=intersection([u'2'],[u'2', u'3'])=[u'2']
union=(int1 U int2 U int3)=[u'2']
到目前为止我尝试过的如下:
from itertools import combinations
'''
Pseudocode:
1) Generate all possible 2-combinations of the lists in txArray
2) Flatten the lists
3) If a value appears more than once in a 2-combination, add it to
list of intersections
4) Keep unique elements in list of intersections
'''
def myIntersection(arrayOfLists):
flat_list=[]
intersections=[]
combs=list(combinations(txArray,2))
for i in range(0, len(combs)):
flat_list.append([item for sublist in combs[i] for item in sublist])
for list in flat_list:
for element in list:
if list.count(element)>1:
if element not in intersections:
intersections.append(element)
return intersections
虽然它在 python 命令行界面中工作,但当我将它保存为 python 文件并运行它时,我不断收到错误。
我的问题是:1)为什么当我将它作为 python 文件运行时它不起作用?
2) 是否有更清洁、更“pythonic”的方式来做到这一点(可能使用列表推导)
3) 我确实考虑过使用集合,但我无法弄清楚将arrayofLists 列表(在一般情况下)迭代转换为集合。是否有一个简单的语法来做到这一点?
太感谢了!
解决方案
您可以使用itertools.combinations
生成长度为 2 的所有可能组合
In [232]: from itertools import combinations
In [233]: list(combinations(txArray, 2))
Out[233]: [(['1'], ['2']), (['1'], ['2', '3']), (['2'], ['2', '3'])]
然后,您可以将每对列表转换为 aset
并对它们执行 anintersection
为您提供一组列表
In [234]: intersections = [set(a).intersection(set(b)) for a, b in combinations(txArray, 2)]
In [235]: intersections
Out[235]: [set(), set(), {'2'}]
最后,您可以union
对集合集合执行 a 以从列表中解压缩所有集合
In [236]: set.union(*intersections)
Out[236]: {'2'}
另外,请注意,解包组合 ( ) 比通过索引 ( )访问更快、更易读[set(a).intersection(set(b)) for a, b in combinations(txArray, 2)]
[set(c[0]).intersection(set(c[1])) for c in combinations(txArray, 2)]
推荐阅读
- wpf - WPF:组合框项目显示在列中
- drupal-7 - CKeditor 图片不显示
- mysql - 从 NiFi 中的 QueryDatabaseTable 获取数据
- python - 从两个列表快速创建对角矩阵
- c# - 通过 Javascript 执行器清除文本值并且操作不起作用!- Selenium
- javascript - 使用 javascript 将选中的 Chechbox 保存到 sqlite 数据库中
- excel - 如何在关键字 Excel 之后将文本组织成行
- regex - 正则表达式删除 URL 中的端口号
- python - python中`itertools.combinations`的计算复杂度是多少?
- java - 如何在现有的和按钮之间添加额外的 LinearLayout?