2

假设我有两个字符串列表:

a = ['####/boo', '####/baa', '####/bee', '####/bii', '####/buu']

其中#### 表示 4 位随机数。和

b = ['boo', 'aaa', 'bii']

我需要知道 list 中的哪个字符串条目a包含b. 我能够通过几个嵌套循环来完成此操作,然后使用in运算符检查字符串是否包含 b 中的当前条目。但是,对于 py 来说相对较新,我几乎可以肯定这不是最 Pythonic 或最优雅的编写方式。那么,有没有这样的成语来减少我的解决方案?

4

5 回答 5

5

以下代码为您提供了一个数组,a其中斜线后面的部分是来自 的元素的索引b

a_sep = [x.split('/')[1] for x in a]
idxs = [i for i, x in enumerate(a_sep) if x in b]

要提高性能,请创建b一个集合而不是列表。

演示:

>>> a = ['####/boo', '####/baa', '####/bee', '####/bii', '####/buu']
>>> b = ['boo', 'aaa', 'bii']
>>> a_sep = [x.split('/')[1] for x in a]
>>> idxs = [i for i, x in enumerate(a_sep) if x in b]
>>> idxs
[0, 3]
>>> [a[i] for i in idxs]
['####/boo', '####/bii']

如果您更喜欢直接获取元素而不是索引:

>>> a = ['####/boo', '####/baa', '####/bee', '####/bii', '####/buu']
>>> b = ['boo', 'aaa', 'bii']
>>> [x for x in a if x.split('/')[1] in b]
['####/boo', '####/bii']
于 2012-05-07T20:34:47.310 回答
2

ThiefMaster 的回答很好,和我的会很相似,但是如果你不需要知道索引,你可以走捷径:

>>> a = ['####/boo', '####/baa', '####/bee', '####/bii', '####/buu']
>>> b = ['boo', 'aaa', 'bii']
>>> [x for x in a if x.split('/')[1] in b]
['####/boo', '####/bii']

同样,如果b是 a set,这将提高大量元素的性能。

于 2012-05-07T20:40:11.393 回答
1
>>> [i for i in a for j in b if j in i]
['####/boo', '####/bii']

这应该做你想要的,优雅和pythonic。

于 2012-05-07T20:38:39.507 回答
1
import random
a=[str(random.randint(1000,9999))+'/'+e for e in ['boo','baa','bee','bii','buu']]

b = ['boo', 'aaa', 'bii']

c=[x.split('/')[-1] for x in a if x.split('/')[-1] in b]

print c

印刷:

['boo', 'bii']

或者,如果您想要整个条目:

print [x for x in a if x.split('/')[-1] in b]

印刷:

['3768/boo', '9110/bii']
于 2012-05-07T20:42:11.520 回答
1

正如其他答案所表明的那样,您可以使用集合操作来加快速度。这是一种方法:

>>> a_dict = dict((item.split('/')[1], item) for item in a)
>>> common = set(a_dict) & set(b)
>>> [a_dict[i] for i in common]
['####/boo', '####/bii']
于 2012-05-07T20:49:18.283 回答