我们有两个清单,
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]
答案 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)
您可以使用map
,filter
和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
中每个元素的false
和s
值。
答案 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]