Python中的子字符串比较

6
如果我有一个电话薄列表 PhoneDirectory,例如:
['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766']

有哪些函数可以用来比较列表中每个条目中子字符串(例如:Joh)的出现情况。

我已经尝试使用

if(PhoneDirectory.find(Joh) != -1)

但它无法正常工作。

请帮忙解决。


你的命名有点问题。按照惯例,大写字母变量名称通常保留给类。PhoneDirectory 对我来说看起来像是字符串列表,我会根据 Python 命名惯例将其称为 phonenumbers。我发现将列表变量名称设为复数形式很有用。 - Tony Veijalainen
只是想指出,这是否最好存储为字典? { s.split( ":" )[ 0 ]: s.split( ":" )[ 1 ] for s in ... } - Katriel
5个回答

19

如果你想单独检查每个条目:

for entry in PhoneDirectory:
    if 'John' in entry: ...
如果你只想知道是否有任何条目满足条件,而不在意哪个是满足条件的:
if any('John' in entry for entry in PhoneDirectory):
    ...

请注意,any不会执行任何“浪费”的工作--只要它找到任何一个符合条件的条目,它就会立即返回True(如果没有任何一项符合条件,则必须检查每一项以确认这一点,然后返回False)。


由于您接近Python的开发,您是否知道为什么“任何”不会返回第一个“True”值(比如“Johnny”),而只是不那么有用的True (即使解释器应该知道确切的答案)?也就是说,它要像在Python中的“或”运算符或者Lisp中的“有用结果”原则一样工作吗?顺便说一句,也许它应该是: 如果任何条目以'John:'开头,则在PhoneDirectory中的每个条目中为真。 - Tony Veijalainen
@Tony,由于any必须在说“否”时返回False(例如对于空列表,不能仅从序列中“返回一些错误值”),出于对称性的原因,最好始终使其返回布尔值。关于你的BTW,也许是这样,但前提是在你的建议中修复语法错误(在'John:'周围加上括号;-)。 - Alex Martelli
我没有你那神一样的力量来进行更改。在发送前,应该始终运行代码;-) - Tony Veijalainen

3
if any(entry.startswith('John:') in entry for entry in PhoneDirectory)

但是我建议您准备一些具有两个元素的内容,因为您的字符串列表不太适合这项任务:

PhoneList = ['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766']

numbers = { a:b 
            for item in PhoneList
            for a,_,b in (item.partition(':'),)
            }

print numbers
print "%s's number is %s." % ( 'John', numbers['John'] )

1

既然还没有人推荐过这个,我就来一发:

all_johns = [p for p in PhoneDirectory if 'Joh' in p]

0
你可以在“:”上进行分割,并在结果数组的第一个元素中查找你要查找的内容。
dir = ['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766'];
for a in dir:
    values = a.split(":")
    if values[0] == "John":
        print("John's number is %s" % (values[1]))

有点过于复杂了,其实没有必要拆分每个条目。 - Justin Ardini
True。 这是我在Python中知道的唯一方法! :-) 喜欢“any”答案。 - Pablo Santa Cruz

0

如果对于这个任务性能很重要,请使用一些SuffixTree实现。或者让任何DBMS引擎执行索引作业。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接