【问题标题】:How to find out if the elements in one list are in another? [duplicate]如何找出一个列表中的元素是否在另一个列表中? [复制]
【发布时间】:2015-04-19 21:25:25
【问题描述】:

我有两个列表:

A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
B = [12, 5]

我试图找出 A 中的哪些列表包含 B 中的元素(顺序无关紧要)并删除其余列表。

在这种情况下,答案是:

[[4, 5, 10, 12], [2, 5, 12, 13], [4, 5, 6, 12]]

如果我们把 B 改成B = [13],答案是:

[[2, 5, 13, 14], [2, 5, 12, 13]]

【问题讨论】:

    标签: python list elements


    【解决方案1】:

    您可以将set.issubset 与列表推导一起使用,使用A[:] 将更改原始/列表对象A:

    A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
    B = [12, 5]
    st = set(B)
    
    A [:] = [sub for sub in A if st.issubset(sub)]
    
    print(A)
    [[4, 5, 10, 12], [2, 5, 12, 13], [4, 5, 6, 12]]
    

    同样适用于 B = [13]

    A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
    B = [13]
    st = set(B)
    
    A [:] = [sub for sub in A if st.issubset(sub)]
    
    print(A)
    [[2, 5, 13, 14], [2, 5, 12, 13]]
    

    set objects

    s.issubset(t) s

    对于非常大的 A 或者如果您有内存限制,您可以使用生成器表达式:

    A [:] = (sub for sub in A if st.issubset(sub))
    

    如果顺序无关紧要并且可以设置,我建议您从一开始就使用它们。对集合进行查找会更有效率。

    稍微大一点的 A 上的一些时间安排:

    In [23]: A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12],[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12],[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
    
    In [24]: B = [12, 5]                                 
    In [25]: timeit  filter(lambda x: all(y in x for y in B), A)
    100000 loops, best of 3: 9.45 µs per loop
    
    In [26]: %%timeit                                    
    st = set(B)
    [sub for sub in A if st.issubset(sub)]
       ....: 
    100000 loops, best of 3: 3.88 µs per loop
     map(lambda x: not B_set-set(x), A)
    In [27]: %%timeit
    ....: B_set = set(B)
    ....: map(lambda x: not B_set-set(x), A)
    ....: 
    100000 loops, best of 3: 6.95 µs per loop
    

    如果您已经将元素作为集合存储在 A 中:

    In [33]: %%timeit                             
    st = set(B)
    [sub for sub in A if sub >= st]
    ....: 
    1000000 loops, best of 3: 1.12 µs per loop
    

    【讨论】:

    • 正在删除其他用户的答案吗? (不是我的)
    • @PedroLobito。不明白你的意思?
    • 很多答案在这个答案上被删除了。
    • @PedroLobito。是的,但我还是不明白你的意思?
    • @Pedro:超过一定级别的代表,您可以看到谁删除了答案。我向您保证,每个答案都被其自己的作者删除。
    【解决方案2】:

    您可以在此处将filterall 结合使用:

    print filter(lambda x: all(y in x for y in B), A)
    

    更有效的答案:

    B_set = set(B)
    print map(lambda x: not B_set-set(x), A)
    

    【讨论】:

      猜你喜欢
      • 2020-07-07
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2017-04-28
      • 2012-08-01
      相关资源
      最近更新 更多