从其他两个列表中派生一个新的列表列表,如果L1中的元素不在L2中,则会在其中添加元素

时间:2018-12-12 22:16:52

标签: python python-3.x

因此,我一直在为即将进行的测试而学习,在练习的过程中我发现了这个脚本;应该返回一个新列表列表,其中包含L1中的列表,其中不包含L2中的任何字符串:

我所做的是将L2中的每个元素与L1中的元素进行比较,并将它们添加到listas中,而没有任何重复。我卡住的部分就在循环运行完之后,我得到了一个列表列表,但没有任何实际的比较。我尝试使用第二个列表,但是它可以工作,但是如果len(L2) > 2不起作用,也.remove()也可以,但是有时要删除的元素不在列表中,并且出现一些错误。 / p>

from typing import List
def non_intersecting(L1: List[List[str]], L2: List[str]) -> List[List[str]]:    
"""Return a new list that contains the original lists inside L1 that do not
contain any of the string in L2

>>> non_intersecting([['e', 'h', 'c', 'w'], ['p', 'j'], ['w', 's', 'u']], ['k', 'w'])
[['p', 'j']]
"""

listas = []

if len(L2) == 0:
    return L1
elif len(L2) > 0:
    for index in range(len(L2)):
        for lists in L1:
            if lists not in listas:
                if L2[index] not in lists:
                    listas.append(lists)

return listas

有帮助吗?不用任何模块也不需要ziplambdas就能做到这一点,因为我不想提交此文件,而是在测试之前了解基本知识。

3 个答案:

答案 0 :(得分:1)

def non_intersecting(l1, l2):
    out = []
    for sub_list in l1:
        if len(list(set(sub_list).intersection(l2))) == 0:  #no common strings
            out.append(sub_list)
    return out

对于此简单操作,无需添加List()构造函数。

答案 1 :(得分:1)

def non_intersecting(L1, L2):
    s2 = set(L2)
    lists_sets = ((l, set(l)) for l in L1)
    return [l for l, s in lists_sets if not s & s2]

答案 2 :(得分:1)

要检查成员资格,可以使用any()not any()

x=[['e', 'h', 'c', 'w'], ['p', 'j'], ['w', 's', 'u']]
y=['k', 'w']

def non_intersecting(l1, l2):
    outlist=[]
    for sublist in x:
        if not any([elem in sublist for elem in y]):
            outlist.append(sublist)
    return outlist

non_intersecting(x, y)

[['p', 'j']]

以上内容也可以简化为列表理解

def non_intersecting(l1, l2):
    return [i for i in x if not any([j in i for j in y])]