根据前面的字符串返回子字符串

时间:2013-02-04 05:00:04

标签: python substring

今天可能有点太多了......但是,好吧。

这个问题让我很困惑。此函数将字符串列表作为参数,并返回每个字符串,该字符串是其前面的字符串的子字符串。所以

  1. [“hope”,“hop”,“hopefully”,“test”,“testing”]将返回['hop']
  2. [“希望”,“希望”,“跳”,“测试”,“测试”]将返回['hope','hop','test']
  3. 请原谅这里乱七八糟的代码,我还在学习。

    def findSubStrs(lst):
    'list ==> list, return list of all strings that are substrings of their predecessor in lst'
    res = []
    for a in lst:
        if len(int(a-1)) > len(lst):
            res = res + [a]
    return res
    

    我认为len(int(a-1))可以检查前面的字符串,但我得到了错误消息“TypeError:forpport'和'int'的不支持的操作数类型”我发现唯一有效的结果是len(a)< 3或其他一些int,但这不会返回我需要的一切。

2 个答案:

答案 0 :(得分:5)

您可以使用zip来比对对象:

>>> s1 = ["hope", "hop", "hopefully", "test", "testing"]
>>> [b for a,b in zip(s1, s1[1:]) if b in a]
['hop']
>>> s2 = ["hopefully", "hope", "hop", "testing", "test"]
>>> [b for a,b in zip(s2, s2[1:]) if b in a]
['hope', 'hop', 'test']

至于你的代码:

res = []
for a in lst:
    if len(int(a-1)) > len(lst):
        res = res + [a]
return res

这将遍历lst中的每个元素。 len(int(a-1))将尝试从字符串中减去1,然后将结果转换为整数,然后取整数的长度,然后将该长度与列表len(lst)的长度进行比较。那不是你想要的。 (另一个答案已经解释了使用循环和索引的正确方法,所以我会停止。)

答案 1 :(得分:2)

怎么回合

print [my_list[i] for i in range(1,len(my_list)) if my_list[i] in my_list[i-1]]

例如

>>> def findSubStrs(my_list):
...     return [my_list[i] for i in range(1,len(my_list)) if my_list[i] in my_list[i-1]]
>>> findSubStrs(["hope", "hop", "hopefully", "test", "testing"] )
['hop']
>>> findSubStrs(["hopefully", "hope", "hop", "testing", "test"])
['hope', 'hop', 'test']

要做到这一点,没有列表理解,你可以使用一个简单的循环

for i in range(1,len(my_list)):
    if my_list[i] in my_list[i-1]:
        print my_list[i]