查找列表列表是否包含其他列表中的项目

时间:2016-02-26 20:00:42

标签: python pandas

我们有两个清单,

l=["a","b","c"]
s=[["a","b","c"],
["a","d","c"],
["a-B1","b","c"],
["a","e","c"],
["a_2","c"],
["a","d-2"],
["a-3","b","c-1-1","d"]]
print l 
print s

现在,我试着看看s的每个第二级列表是否与列表l中的任何项都模糊匹配。

matches=list() 
matchlist2=list()   
print s2
for i in range(len(s)):
    matches.append([])
    for j in range(len(s[i])):

        for x in l:
            if s[i][j].find(x)>=0:
                print s[i][j]
                matches[i].append(True)

                break
        else:
            matches[i].append(False)


    matchlist2.append(all(x for x in matches[i]))
print matches
print matchlist2

这给了我预期的目的。但我对它如此多的循环感到不满意。我也在和熊猫一起工作,如果有大熊猫解决方案那将是很好的。在pandas中,只有两列两个数据帧。

[[True, True, True], [True, False, True], [True, True, True], [True, False, True], [True, True], [True, False], [True, True, True, False]]

第二个代码检查子列表中的所有项是否匹配。

[True, False, True, False, True, False, False]

3 个答案:

答案 0 :(得分:2)

我更喜欢这种解决方案的简洁性和可读性:

>>> [all(any(x.startswith(y) for y in l) for x in sub) for sub in s]
[True, False, True, False, True, False, False]

答案 1 :(得分:1)

您可以使用mapfilter和lambda表达式在几行中写出来:

matches = map(lambda b:[len(filter(lambda x:x in a,l))>0 for a in b],s)

matchlist2 = [all(a) for a in matches]

此表达式filter(lambda x:x in a,l)返回l中字符串s中字符串一部分的所有元素。然后使用len...>0来验证是否找到至少一个元素。然后使用最终的lambda(lambda b)获取true中每个元素的falses值。

答案 2 :(得分:0)

检查每个项目是否在参考列表中:

[[e in l for e in sl] for sl in s]

检查所有项目是否都在参考列表中:

[all(e in l for e in sl) for sl in s]