【问题标题】:how can I test for ordered subset我如何测试有序子集
【发布时间】:2016-10-19 03:59:56
【问题描述】:

首先
我需要能够测试'abc''axbyc' 的有序子集,而'egd' 不是'edg' 的有序子集。另一种说法是,如果我可以删除一个字符串的特定字符并使其等于另一个字符串,它就是一个有序子集。

其次
我需要将一个pd.Series 与另一个pd.Series 进行比较,以确定一个的元素是否是另一个对应元素的有序子集。

考虑 pd.Series s1s2

s1 = pd.Series(['abc', 'egd'])
s2 = pd.Series(['axbyc', 'edg'])

我需要比较它们以便问题的结果
s1 的元素是s2 的有序子集是否等于

0     True
1    False
dtype: bool

【问题讨论】:

标签: python pandas


【解决方案1】:

对于问题的第一部分:

def ordered_subset(s1, s2):
    s2 = iter(s2)
    try:
        for c in s1:
            while next(s2) != c:
                pass
        else:
            return True
    except StopIteration:
        return False

对于问题的第二部分:

pd.concat([s1, s2], axis=1).apply(lambda x: ordered_subset(*x), axis=1)

0     True
1    False
dtype: bool

【讨论】:

    【解决方案2】:

    使用'.*'.join 创建一个正则表达式模式来匹配序列。

    import re
    import pandas as pd
    
    s1 = pd.Series(['abc', 'egd'])
    s2 = pd.Series(['axbyc', 'edg'])
    
    match = lambda x: bool(re.match(*x))
    pd.concat([s1.str.join('.*'), s2], axis=1).T.apply(match)
    
    0     True
    1    False
    dtype: bool
    

    注意

    s1.str.join('.*')
    
    0    a.*b.*c
    1    e.*g.*d
    Name: x, dtype: object
    

    【讨论】:

    • 有趣的解决方案!对于一般的子序列测试,我有两个建议:1)使用re.search而不是re.match--或在连接的字符串前面加上'.*'--以允许两个字符串以不同的字符开头(@987654327 @ 是"zaxbyc") 的子序列; 2)如果您的字符串可以包含的不仅仅是字母,mapre.escape 在第一个字符串上以避免与正则表达式元字符冲突(例如,您可以测试"ab*" 是否是"zaxby*" 的子序列) .
    • 我不建议在 Python 的回溯实现中使用这样的正则表达式,请考虑:re.match('.*'.join("a" * 30), "a" * 30)
    • @FranciscoCouzo 我几乎肯定会放弃这种方法以换取别的东西。我正在尝试对其进行矢量化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2020-12-02
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多