3

我刚刚了解到,我可以使用以下方法检查子字符串是否在字符串中:

字符串中的子字符串

在我看来,字符串只是一种特殊的元组,其元素是字符。所以我想知道是否有一种直接的方法可以在元组中搜索元组的一部分。元组中的元素可以是任何类型。

元组中的元组

现在我相关的第二个问题:

>>> tu = 12 ,23, 34,56
>>> tu[:2] in tu
False

我认为我得到 False 因为 (12, 23) 不是 tu 的一个元素。但是,为什么字符串中的子字符串有效?幕后隐藏着语法糖吗?

4

5 回答 5

5

string不是tuple. 事实上两者都属于不同的类别。如何in评估语句取决于__contains__()相应类中定义的魔术函数。

阅读如何在 python 中设置 contains 方法,可能你会发现它很有用。要了解 Python 中的魔术函数,请阅读:Python 魔术方法指南

于 2016-09-13T21:11:03.183 回答
3

字符串不仅仅是一种特殊的元组。它们有许多相似的属性,特别是,它们都是迭代器,但它们是不同的类型,并且每个都以不同的方式定义in运算符的行为。请参阅此处的文档:https ://docs.python.org/3/reference/expressions.html#in

为了解决您查找一个元组是否是另一个元组的子序列的问题,编写一个像您的答案一样的算法将是可行的方法。尝试这样的事情:

def contains(inner, outer):
  inner_len = len(inner)
  for i, _ in enumerate(outer):
    outer_substring = outer[i:i+inner_len]
    if outer_substring == inner:
      return True
  return False
于 2016-09-13T21:06:58.587 回答
1

这就是我完成我的第一个请求的方式,但是,它既不简单也不像pythonic。我不得不迭代 Java 方式。我无法使用“for”循环来实现它。

def tupleInside(tupleSlice):
    i, j = 0, 0
    while j < len(tu):
        t = tu[j]
        ts = tupleSlice[i]
        print(t, ts, i, j)
        if ts == t:
            i += 1
            if i == len(tupleSlice):
                return True
        else:
            j -= i
            i = 0
        j += 1
    return False

tu = tuple('abcdefghaabedc')
print(tupleInside(tuple(input('Tuple slice: '))))
于 2016-09-14T20:25:37.790 回答
0

尝试只玩元组和拼接。在这种情况下,它很容易,因为您的拼接本质上是索引。

>>> tu = 12 ,23, 34,56  
>>> tu
(12, 23, 34, 56) #a tuple of ints
>>> tu[:1] # a tuple with an int in it
(12,) 
>>> tu[:1] in tu #checks for a tuple against int. no match.
False 
>>> tu[0] in tu #checks for int against ints. matched!
True
>>> #you can see as we iterate through the values...
>>> for i in tu:
         print(""+str(tu[:1])+" == " + str(i))

(12,) == 12
(12,) == 23
(12,) == 34
(12,) == 56

拼接返回一个元组列表,但您需要进一步索引以in按值而不是容器进行比较。拼接字符串返回值,字符串和in操作符可以比较值,但是拼接元组返回元组,元组是容器。

于 2016-09-13T21:14:28.953 回答
0

只需添加到 Cameron Lee 的答案,以便它接受inner包含单个整数。

def contains(inner, outer):
    try:
        inner_len = len(inner)
        for i, _ in enumerate(outer):
            outer_substring = outer[i:i+inner_len]
            if outer_substring == inner:
                return True
        return False
    except TypeError:
        return inner in outer

contains(4, (3,1,2,4,5))  # returns True
contains((4), (3,1,2,4,5))  # returns True
于 2016-09-15T09:21:20.863 回答