Python 关于元组和字符串的新手说明

Python newbie clarification about tuples and strings

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

substring in string

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

tupleslice in tuple

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

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

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

字符串不仅仅是一种特殊的元组。它们有许多相似的属性,特别是,它们都是迭代器,但它们是不同的类型,并且每个都以不同的方式定义 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

string 不是 tuple 的类型。事实上两者属于不同的class。如何评估 in 语句是基于 __contains__() 在相应 class.

中定义的魔法函数

阅读How do you set up the contains method in python, may be you will find it useful. To know about magic functions in Python, read: A Guide to Python's Magic Methods

尝试使用元组和拼接。在这种情况下,它非常简单,因为您的拼接本质上是索引。

>>> 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

拼接是 return 元组列表,但您需要进一步索引以按值而不是容器比较 in。拼接字符串 return 值,字符串和 in 运算符可以比较值,但拼接元组 returns 元组,它们是容器。

这就是我完成第一个请求的方式,但是,它既不简单也不是 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: '))))

只需添加到 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