在字符串python iterables vs list iterables中搜索

时间:2014-10-27 05:10:03

标签: python

有人可以解释为什么搜索如下

2,2,2,2范围(20)

产生的结果为(2,2,2,True)

和范围(20)中的5,4,3,19

得到的结果为(5,4,3,True)

像" tab"在"蝙蝠侠"给出假,而#34; bat"在"蝙蝠侠"是真的。同样,为什么订单未在上述搜索中保留。我也想解释它给出的结果。

4 个答案:

答案 0 :(得分:4)

执行此操作时:

2,2,2,2 in range(20)

Python以这种方式看待它:

2,2,2,(2 in range(20))

您希望以这种方式对待它:

(2,2,2,2) in range(20)

但是由于Python不是面向矢量的,所以它并不像那样工作。如果你喜欢用向量编程,NumPy更合适,但对于基本的Python比较,它并不像你想象的那样工作。

至于此:

"tab" in "batman"

当然它返回false,因为字符串"tab"不在字符串"batman"中。它是一个字符串搜索,而不是搜索字符(即它不查找字谜)。

答案 1 :(得分:1)

2,2,2,2 in range(20) 构造一个包含四个元素的元组,前三个元素为2,最后一个是布尔表达式2 in range(20),其值为True

在python中,逗号创建一个元组。 这有点令人困惑。

因此,2,将创建一个新的单值元组
(2)将返回一个整数。

答案 2 :(得分:1)

in是一个布尔表达式。因此,当您输入2,2,2,2 in range(20)时,您正在创建包含三个2的元组以及布尔表达式2 in range(20)的结果,即True

答案 3 :(得分:1)

in调用对象的__contains__方法,所以

 2,2,2,2 in range(20)

装置

 2,2,2,(range(20).__contains__(2))

 5,4,3,19 in range(20)

装置

 5,4,3,(range(20).__contains__(19))

因此range * 返回的对象决定in的行为方式。

字符串对__contains__有不同的行为。它可以作为子字符串搜索。

2,2,2,2 in range(20)是一种不寻常的表达方式。你的意思可能是

all(x in range(20) for x in (2,2,2,2))

*在Python2 range中返回list,在Python3中返回range对象