2016-07-02 173 views
-3

我知道如果我只有两个使用x in y检查的字符串可以工作。如果我只是想检查一个字符串是否在列表中的任何字符串中,我只需使用for循环即可。检查一个列表中的任何字符串是否是另一个列表中的子字符串

但是,检查第一个列表中的任何字符串是否是第二个列表中字符串的子字符串的最pythonic /有效的方法是什么?

一个例子是:

notPresent = [] 
present = [] 
listA = ['Rick', 'James'] 
listB = ['Rick', 'Ricky', 'Ryan', 'Jam', 'Jamesses', 'Jamboree'] 

notPresent = ['Ryan', 'Jam', 'Jamboree'] 
present = ['Rick', 'Ricky', 'Jamesses'] 

我要同时使用presentnotPresent话。

+0

*“检查是否有任何”* - ['any'](https://docs.python.org/3/library/functions.html#any)?你是否有当前的代码,你认为是不合理的和/或低效的? – jonrsharpe

+0

任何与“列表中的任何元素”一样。我正在研究如何做到这一点,而不是优化现有的代码。我猜for for循环内的for循环。 – McLeodx

+0

是的,我了解,而且我说*有一个内置函数*。按照链接,看看! – jonrsharpe

回答

0

我会说这样的事情:

#python2 
notPresent = set() 
present = set() 
listA = ['Rick', 'James'] 
listB = ['Rick', 'Ricky', 'Ryan', 'Jam', 'Jamesses', 'Jamboree'] 

#notPresent = ['Ryan','Jam','Jamboree'] 
#present = ['Rick','Ricky','Jamesses'] 

for b in listB: 
    for a in listA: 
    if a in b: 
     present.add(b) 
     break 
    else: 
    notPresent.add(b) 

print(list(notPresent)) 
print(list(present)) 

所以基本上2环。并用套来代替名单(FR值的唯一性)......

+0

*为什么*你会说这样的话吗?你能添加一些解释吗?一个显而易见的问题是,即使在项目匹配后,您仍然继续扫描“listA”。 – jonrsharpe

+0

我修正了匹配后的扫描。我这样做的原因是因为它是一个清晰可读的问题(通过列表中的项目扫描另一个列表,看起来像2 for循环给我)。 鉴于你想为listB的每个元素做些什么,在scannin listA之后,我发现清楚地将listB的for循环放在外环中。 设置看起来更清晰,因为它们只存储一个值,而且只需要一次元素。然而,随着休息时间,名单工作也一样(我assmume)... –

+0

1.请解释*在答案*。 2.这是一个很小的修复,请注意,'for:else:'结构会移除您现在拥有的(稍微不合理的)标志。 – jonrsharpe

1

你可以用any做到这一点,一个set理解:

listA = ['Rick', 'James'] 
listB = ['Rick', 'Ricky', 'Ryan', 'Jam', 'Jamesses', 'Jamboree'] 

present = {i for i in listB if any(j in i for j in listA)} 
notPresent = set(listB) - present # difference of two sets 

print(present) 
# {'Rick', 'Ricky', 'Jamesses'} 

print(notPresent) 
# {'Jamboree', 'Ryan', 'Jam'} 

any有助于避免一场比赛后运行迭代的整个长度已被发现,并且与set可以从第一个生成补充集notPresent

1

最快的方法可能是把第一个列表为一组

setA = set(listA) 

然后,每串在listB,检查是否有其子是在setA

def substrings(s): 
    for i in range len(s) 
     for j in range i 
      yield s[i:j] 

result = [] 
for s in listB: 
    if any(substring in setA for substring in substrings(s)): 
     result.append(s) 
+0

记得要小写字符串第一个 –

+0

如果你想得到更多的花式,查找“后缀数组数据结构” –

相关问题