我想在 python 中找到另一个列表值的第一个列表值,在那里我也使用了 match
和 set
和 findall
其他方法,但它在我的代码中效果不佳。< /p>
这里我想匹配 pattern
在 longlist
中并且模式总是 startwith。
pattern = ['aaa','bbbb','ccc']
longlist = ['aaa845','bbbbPP44','XXX10','aaa420','ccc1','jjj7000','PPPP']
for i in longlist: # longlist is json data, So this line required. After we can do it any code
if filter(pattern.match, i):
print(i)
# other tried
if set(pattern) & set(longlist):
print(i)
期望输出:aaa845, bbbbPP44, aaa420, ccc1
谁能建议最好的编码风格,而无需多次 FOR
循环迭代和最快的性能?
答案 0 :(得分:2)
您可以使用带有 any
的列表推导式,如果找到匹配项,它会短路内循环。
这会检查模式中的任何单词是否“包含”在 longlist
的单词中。
>>> pattern = ['aaa','bbbb','ccc']
>>> longlist = ['aaa845','bbbbPP44','XXX10','aaa420','ccc1','jjj7000','PPPP']
>>> [i for i in longlist if any(j in i for j in pattern)]
['aaa845', 'bbbbPP44', 'aaa420', 'ccc1']
如果您希望 longlist
中的单词以模式中的任何一个“开头”,那么您需要像这样更改条件。
>>> [i for i in longlist if any(i.startswith(j) for j in pattern)]
['aaa845', 'bbbbPP44', 'aaa420', 'ccc1']
在您给定的示例中,两者碰巧产生相同的结果。