两个列表列表之间的公共元素(嵌套列表的交集)

Common elements between two lists of lists (intersection of nested lists)

本问题已经有最佳答案,请猛点这里访问。

我有两个大的二维点列表,如果有的话,我想找到它们的公共子列表。这两个列表都很大,效率是个问题。

t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]

for i in itertools.chain.from_iterable(t1):

  if i in t2:

    print"yes",iintersection = [i for i in t1 if i in t2]
t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23], [3,41]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



print st1.intersection(st2)

set([3,41])
 t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

 t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]
t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



from collections import defaultdict

d1 = defaultdict(int)

d2 = defaultdict(int)

for i in nt1:

  d1[i] += 1#counting element occurrence from first list



for i in nt2:

  d2[i] += 1 #counting element occurrence from second list



result_list = []



for i in st1.intersection(st2):

  min_count = min(d1[i], d2[i]) #selecting the minimum one to multiply

  result_list+=map(lambda x:list(i), xrange(0, min_count))



print result_list
[[3, 41], [3, 41]]
l1 = [[1,2],[2,3]]

l2 = [[3,4],[2,3]]

list(set(map(tuple,l1)).intersection(set(map(tuple,l2))))

>> [(2, 3)]

我尝试了下面的 itertools,但我得到"ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()"。

t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]

for i in itertools.chain.from_iterable(t1):

  if i in t2:

    print"yes",iintersection = [i for i in t1 if i in t2]
t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23], [3,41]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



print st1.intersection(st2)

set([3,41])
 t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

 t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]
t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



from collections import defaultdict

d1 = defaultdict(int)

d2 = defaultdict(int)

for i in nt1:

  d1[i] += 1#counting element occurrence from first list



for i in nt2:

  d2[i] += 1 #counting element occurrence from second list



result_list = []



for i in st1.intersection(st2):

  min_count = min(d1[i], d2[i]) #selecting the minimum one to multiply

  result_list+=map(lambda x:list(i), xrange(0, min_count))



print result_list
[[3, 41], [3, 41]]
l1 = [[1,2],[2,3]]

l2 = [[3,4],[2,3]]

list(set(map(tuple,l1)).intersection(set(map(tuple,l2))))

>> [(2, 3)]

我也从这里尝试了第一个答案,但我得到 'numpy.int64' object is not iterable。

另外,我认为这个简单的代码可以工作,但是需要很多时间:

t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]

for i in itertools.chain.from_iterable(t1):

  if i in t2:

    print"yes",iintersection = [i for i in t1 if i in t2]
t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23], [3,41]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



print st1.intersection(st2)

set([3,41])
 t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

 t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]
t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



from collections import defaultdict

d1 = defaultdict(int)

d2 = defaultdict(int)

for i in nt1:

  d1[i] += 1#counting element occurrence from first list



for i in nt2:

  d2[i] += 1 #counting element occurrence from second list



result_list = []



for i in st1.intersection(st2):

  min_count = min(d1[i], d2[i]) #selecting the minimum one to multiply

  result_list+=map(lambda x:list(i), xrange(0, min_count))



print result_list
[[3, 41], [3, 41]]
l1 = [[1,2],[2,3]]

l2 = [[3,4],[2,3]]

list(set(map(tuple,l1)).intersection(set(map(tuple,l2))))

>> [(2, 3)]

有什么建议吗?谢谢。


列表是不可散列的,所以我们需要将内部列表转换为元组,然后我们可以使用集合交集来查找公共元素

t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]

for i in itertools.chain.from_iterable(t1):

  if i in t2:

    print"yes",iintersection = [i for i in t1 if i in t2]
t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23], [3,41]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



print st1.intersection(st2)

set([3,41])
 t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

 t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]
t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



from collections import defaultdict

d1 = defaultdict(int)

d2 = defaultdict(int)

for i in nt1:

  d1[i] += 1#counting element occurrence from first list



for i in nt2:

  d2[i] += 1 #counting element occurrence from second list



result_list = []



for i in st1.intersection(st2):

  min_count = min(d1[i], d2[i]) #selecting the minimum one to multiply

  result_list+=map(lambda x:list(i), xrange(0, min_count))



print result_list
[[3, 41], [3, 41]]
l1 = [[1,2],[2,3]]

l2 = [[3,4],[2,3]]

list(set(map(tuple,l1)).intersection(set(map(tuple,l2))))

>> [(2, 3)]

输出

t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]

for i in itertools.chain.from_iterable(t1):

  if i in t2:

    print"yes",iintersection = [i for i in t1 if i in t2]
t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23], [3,41]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



print st1.intersection(st2)

set([3,41])
 t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

 t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]
t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



from collections import defaultdict

d1 = defaultdict(int)

d2 = defaultdict(int)

for i in nt1:

  d1[i] += 1#counting element occurrence from first list



for i in nt2:

  d2[i] += 1 #counting element occurrence from second list



result_list = []



for i in st1.intersection(st2):

  min_count = min(d1[i], d2[i]) #selecting the minimum one to multiply

  result_list+=map(lambda x:list(i), xrange(0, min_count))



print result_list
[[3, 41], [3, 41]]
l1 = [[1,2],[2,3]]

l2 = [[3,4],[2,3]]

list(set(map(tuple,l1)).intersection(set(map(tuple,l2))))

>> [(2, 3)]

由于我们将列表分成集合,因此我们不考虑重复。考虑以下输入

t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]

for i in itertools.chain.from_iterable(t1):

  if i in t2:

    print"yes",iintersection = [i for i in t1 if i in t2]
t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23], [3,41]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



print st1.intersection(st2)

set([3,41])
 t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

 t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]
t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



from collections import defaultdict

d1 = defaultdict(int)

d2 = defaultdict(int)

for i in nt1:

  d1[i] += 1#counting element occurrence from first list



for i in nt2:

  d2[i] += 1 #counting element occurrence from second list



result_list = []



for i in st1.intersection(st2):

  min_count = min(d1[i], d2[i]) #selecting the minimum one to multiply

  result_list+=map(lambda x:list(i), xrange(0, min_count))



print result_list
[[3, 41], [3, 41]]
l1 = [[1,2],[2,3]]

l2 = [[3,4],[2,3]]

list(set(map(tuple,l1)).intersection(set(map(tuple,l2))))

>> [(2, 3)]

我们在两个列表中都有两个 [3,41],但是前面的 python 程序将在输出中只输出一个 [3,41]。以下程序将通过最初计算重复条目并在之后重复它们来处理重复条目。

t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]

for i in itertools.chain.from_iterable(t1):

  if i in t2:

    print"yes",iintersection = [i for i in t1 if i in t2]
t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23], [3,41]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



print st1.intersection(st2)

set([3,41])
 t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

 t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]
t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



from collections import defaultdict

d1 = defaultdict(int)

d2 = defaultdict(int)

for i in nt1:

  d1[i] += 1#counting element occurrence from first list



for i in nt2:

  d2[i] += 1 #counting element occurrence from second list



result_list = []



for i in st1.intersection(st2):

  min_count = min(d1[i], d2[i]) #selecting the minimum one to multiply

  result_list+=map(lambda x:list(i), xrange(0, min_count))



print result_list
[[3, 41], [3, 41]]
l1 = [[1,2],[2,3]]

l2 = [[3,4],[2,3]]

list(set(map(tuple,l1)).intersection(set(map(tuple,l2))))

>> [(2, 3)]

输出

t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]

for i in itertools.chain.from_iterable(t1):

  if i in t2:

    print"yes",iintersection = [i for i in t1 if i in t2]
t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23], [3,41]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



print st1.intersection(st2)

set([3,41])
 t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

 t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]
t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



from collections import defaultdict

d1 = defaultdict(int)

d2 = defaultdict(int)

for i in nt1:

  d1[i] += 1#counting element occurrence from first list



for i in nt2:

  d2[i] += 1 #counting element occurrence from second list



result_list = []



for i in st1.intersection(st2):

  min_count = min(d1[i], d2[i]) #selecting the minimum one to multiply

  result_list+=map(lambda x:list(i), xrange(0, min_count))



print result_list
[[3, 41], [3, 41]]
l1 = [[1,2],[2,3]]

l2 = [[3,4],[2,3]]

list(set(map(tuple,l1)).intersection(set(map(tuple,l2))))

>> [(2, 3)]

如果你真的只使用 list 那么,你可以从列表中创建 set 并为你的情况使用 set().intersection() -

t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]

for i in itertools.chain.from_iterable(t1):

  if i in t2:

    print"yes",iintersection = [i for i in t1 if i in t2]
t1 = [[3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[161, 160], [169, 260], [187, 540], [192, 10], [205, 23], [3,41]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



print st1.intersection(st2)

set([3,41])
 t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

 t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]
t1 = [[3, 41], [3, 41], [5, 82], [10, 31], [11, 34], [14, 54]]

t2 = [[3,41], [3,41], [161, 160], [169, 260], [187, 540], [192, 10], [205, 23]]



nt1 = map(tuple, t1)

nt2 = map(tuple, t2)



st1 = set(nt1)

st2 = set(nt2)



from collections import defaultdict

d1 = defaultdict(int)

d2 = defaultdict(int)

for i in nt1:

  d1[i] += 1#counting element occurrence from first list



for i in nt2:

  d2[i] += 1 #counting element occurrence from second list



result_list = []



for i in st1.intersection(st2):

  min_count = min(d1[i], d2[i]) #selecting the minimum one to multiply

  result_list+=map(lambda x:list(i), xrange(0, min_count))



print result_list
[[3, 41], [3, 41]]
l1 = [[1,2],[2,3]]

l2 = [[3,4],[2,3]]

list(set(map(tuple,l1)).intersection(set(map(tuple,l2))))

>> [(2, 3)]

但是对于非常非常大的 lists,这种方法可能会很慢。

编辑:使用 map 函数。


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161