python - 如何在列表中的两个项目之间找到项目?
问题描述
我有以下列表
a = [['-','k','-','x','k','x','-', 'k'],
['k','k','-','x','k','-','-', 'k'],
['k','-','-','x','k','-','x', 'k'],
['x','k','x','x','k','-','-', '-']]
如果您看到上面的列表,则外部列表中的有效项目(子列表)仅在“k”之间至少有一个“x”。您可以有两个以上的“k”,但它们之间必须有“x”。
我想找出两个“k”之间是否存在“x”。
如何在python中实现?
我想过滤有效的内部列表。基本上,我正在尝试使用置换“-”、“x”和“k”来生成各种列表。该列表仅在“k”之间至少有一个“x”时才有效。您可以有两个以上的“k”,但它们之间必须有“x”。
例如a[0]
是有效的,因为“k”之间总是有“x”。
a[1]
无效。
a[2]
已验证。
a[3]
已验证。
所以最终结果应该是
a_filtered = [['-','k','-','x','k','x','-', 'k'],
['k','-','-','x','k','-','x', 'k'],
['x','k','x','x','k','-','-', '-']].
任何提示或帮助表示赞赏。
解决方案
我认为可以使用 str.join 和正则表达式来解决,如下所示:
import re
if __name__ == '__main__':
a = [['-','k','-','x','k','x','-', 'k'],
['k','k','-','x','k','-','-', 'k'],
['k','-','k','-','x','k','-','-','k'], # added to check 'k' + arbitrary length of non-x + 'k'
['k','-','-','x','k','-','x', 'k'],
['x','k','x','x','k','-','-', '-']]
pat = re.compile("k[^x]*k")
b = [lst for lst in a if not pat.match("".join(lst))]
# show what happens
a_strs = ["".join(lst) for lst in a]
for a_str in a_strs:
a_match_not_allowed = pat.match(a_str)
print(f"[main] str: {a_str}, not allowed: {a_match_not_allowed}")
print(*b, sep="\n")
核心代码:
pat = re.compile("k[^x]*k")
b = [lst for lst in a if not pat.match("".join(lst))]
结果:
[main] str: -k-xkx-k, not allowed: None
[main] str: kk-xk--k, not allowed: <re.Match object; span=(0, 2), match='kk'>
[main] str: k-k-xk--k, not allowed: <re.Match object; span=(0, 3), match='k-k'>
[main] str: k--xk-xk, not allowed: None
[main] str: xkxxk---, not allowed: None
['-', 'k', '-', 'x', 'k', 'x', '-', 'k'],
['k', '-', '-', 'x', 'k', '-', 'x', 'k'],
['x', 'k', 'x', 'x', 'k', '-', '-', '-']
您可以通过使用上述正则表达式来避免在 k 之间匹配任意长度的非 x 字符。