首页 > 解决方案 > 如何在列表中的两个项目之间找到项目?

问题描述

我有以下列表

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','-','-', '-']].

任何提示或帮助表示赞赏。

标签: pythonstringlist

解决方案


我认为可以使用 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 字符。


推荐阅读